分层检索

  1. 云栖社区>
  2. 博客>
  3. 正文

分层检索

ryan_bai 2017-10-16 11:00:00 浏览435
展开阅读全文

一、语法

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;

网友评论

登录后评论
0/500
评论
ryan_bai
+ 关注