ITPub博客

首页 > 数据库 > Oracle > 分层检索

分层检索

原创 Oracle 作者:brj880719 时间:2017-10-16 11:07:34 0 删除 编辑

一、语法

  1. SELECT *
  2.   FROM SOME_TABLE
  3. [ WHERE 条件1 ]
  4. CONNECT BY [ 条件2 ]
  5.   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

四、例句

  1. --创建示例表:
  2. CREATE TABLE TBL_TEST (
  3. ID NUMBER,
  4. NAME VARCHAR2(100 BYTE),
  5. PID NUMBER DEFAULT 0
  6. );

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

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

  18. --从末梢往树ROOT递归:
  19.  SELECT *
  20.    FROM TBL_TEST
  21.   START WITH ID = 5
  22. CONNECT BY PRIOR PID = ID;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24851054/viewspace-2146011/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-12-06

  • 博文量
    75
  • 访问量
    67556