分层检索

简介: 一、语法 SELECT * FROM SOME_TABLE[ WHERE 条件1 ]CONNECT BY [ 条件2 ] START WITH [ 条件3 ] START WITH:指定阶层的根,也就是递归开始的地方; CONNECT BY [NOCYCLE] [PRIOR]:指定阶层的父/子关系 NOCYCLE:存在CONNECT BY LOOP的纪录时,也返回查询结果。

一、语法

SELECT *
  FROM SOME_TABLE
[ WHERE 条件1 ]
CONNECT BY [ 条件2 ]
  START WITH [ 条件3 ]

START WITH:指定阶层的根,也就是递归开始的地方;

CONNECT BY [NOCYCLE] [PRIOR]:指定阶层的父/子关系

NOCYCLE:存在CONNECT BY LOOP的纪录时,也返回查询结果。

PRIOR:缺省:只能查询到符合条件的起始行,并不进行递归查询;

  CONNECT BY PRIOR expr = expr:前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点)

  CONNECT BY expr = PRIOR expr:后一种写法表示采用自下而上的搜索方式(先找叶子节点然后找父节点)。 

二、执行原理

在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:

第一步:从根节点开始;

第二步:访问该节点;

第三步:判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;

第四步:若该节点为根节点,则访问完毕,否则执行第五步;

第五步:返回到该节点的父节点,并执行第三步骤。

总之:扫描整个树结构的过程也即是中序遍历树的过程。

三、相关函数

LEVEL:通过LEVEL虚拟列表示节点层级。

SYS_CONNECT_BY_PATH:函数就是从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串,这个功能还是很强大的。

CONNECT_BY_ROOT :函数用来列的前面,记录的是当前节点的根节点的内容。

CONNECT_IS_LEAF:函数用来判断当前节点是否包含下级节点,如果包含的话,说明不是叶子节点,这里返回0;反之,如果不包含下级节点,这里返回1

四、例句

--创建示例表:
CREATE TABLE TBL_TEST (
ID    NUMBER,
NAME  VARCHAR2(100 BYTE),
PID   NUMBER DEFAULT 0
);

--插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');

--从Root往树末梢递归:
 SELECT * 
   FROM TBL_TEST 
  START WITH ID = 1 
CONNECT BY PRIOR ID = PID;

--从末梢往树ROOT递归:
 SELECT * 
   FROM TBL_TEST 
  START WITH ID = 5 
CONNECT BY PRIOR PID = ID;
目录
相关文章
|
10月前
|
人工智能 Dart IDE
SonarQube Server 10.8 发布,新增功能概览
SonarQube Server 10.8 发布,新增功能概览
244 5
SonarQube Server 10.8 发布,新增功能概览
|
SQL 前端开发 JavaScript
基于python+django的外卖点餐网站-外卖点餐系统
该系统是基于python+django开发的外卖点餐系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。
323 0
|
缓存 前端开发 JavaScript
优化的艺术:提升网站性能的十大关键技术策略
【7月更文第9天】在当今快速发展的互联网时代,网站性能直接影响用户体验和业务转化率。一个高性能的网站不仅能够吸引并留住用户,还能在搜索引擎排名中占据有利位置。本文将深入探讨提升网站性能的十大关键技术策略,并提供实用的代码示例帮助开发者实施这些优化措施。
843 3
|
11月前
|
设计模式 缓存 开发者
Python中的装饰器:从入门到实践####
本文深入探讨了Python中强大的元编程工具——装饰器,它能够以简洁优雅的方式扩展函数或方法的功能。通过具体实例和逐步解析,文章不仅介绍了装饰器的基本原理、常见用法及高级应用,还揭示了其背后的设计理念与实现机制,旨在帮助读者从理论到实战全面掌握这一技术,提升代码的可读性、可维护性和复用性。 ####
|
存储 消息中间件 监控
|
存储 NoSQL 搜索推荐
如何打造千万级Feed流系统
Feed流是一个目前非常常见的功能,在众多产品中都有展现,比如微博,朋友圈,消息广场,通知,IM等。通过Feed流可以把动态实时的传播给订阅者,是用户获取信息流的一种有效方式。在大数据时代,如何打造一个千万级规模的Feed流系统仍然是一个挑战。本文中会介绍如何设计一个千万量级的Feed流系统的架构。
75234 128
|
分布式计算 算法 MaxCompute
阿里云 MaxCompute 计算长尾问题优化 2
阿里云 MaxCompute 计算长尾问题优化 2
330 0
阿里云 MaxCompute 计算长尾问题优化 2
|
Ubuntu Unix Linux
Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件
未来我们可以在Windows里访问Linux文件了。微软此前曾透露计划在Windows 10中发布完整的Linux内核,现在该公司计划将Linux文件访问完全集成到内置的文件资源管理器中。在文件资源管理器的左侧导航窗格中将提供一个新的Linux图标,可为Windows 10中安装的所有发行版提供对根文件系统的访问。
476 0
Windows 10变身开发者利器:内置Linux内核,轻松查看Linux子系统文件
|
Linux API Windows
利用LD_PRELOAD进行hook
利用LD_PRELOAD进行hook
657 0