ITPub博客

首页 > 数据库 > Oracle > 【层次查询】Hierarchical Queries之寻根问祖(CONNECT_BY_ROOT一元运算符)

【层次查询】Hierarchical Queries之寻根问祖(CONNECT_BY_ROOT一元运算符)

原创 Oracle 作者:OCMU联盟 时间:2010-01-02 23:25:31 0 删除 编辑
有关层次查询之前的文章参考如下。
【层次查询】Hierarchical Queries之“树的遍历”
http://space.itpub.net/519536/viewspace-623809
【层次查询】Hierarchical Queries之LEVEL应用
http://space.itpub.net/519536/viewspace-623916
【层次查询】Hierarchical Queries之CONNECT_BY_ISCYCLE伪列
http://space.itpub.net/519536/viewspace-624032
【层次查询】Hierarchical Queries之CONNECT_BY_ISLEAF伪列
http://space.itpub.net/519536/viewspace-624075
【层次查询】Hierarchical Queries之SYS_CONNECT_BY_PATH函数
http://space.itpub.net/519536/viewspace-624099

CONNECT_BY_ROOT这个一元运算符只能在层次查询中使用,功能很简单,可以得到每个分支的根节点信息。
记住,既然是一元运算符,那么这个运算符后面一定要有“运算内容”。

1.回望关系“树”
      A
     / \
    B   C
   /   /
  D   E
 / \
F   G

2.重温一下阐述上图的T表数据
sec@ora10g> select * from t;

X                   Y          Z
---------- ---------- ----------
A                   1
B                   2          1
C                   3          1
D                   4          2
E                   5          3
F                   6          4
G                   7          4

7 rows selected.

3.我们结合LEVEL伪列和SYS_CONNECT_BY_PATH函数看一下CONNECT_BY_ROOT对X列运算后的结果
sec@ora10g> col tree for a16
sec@ora10g> col tree_path for a16
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path,CONNECT_BY_ROOT x from t connect by prior y=z;

TREE             TREE_PATH        CONNECT_BY
---------------- ---------------- ----------
B                /B               B
 D               /B/D             B
  F              /B/D/F           B
  G              /B/D/G           B
C                /C               C
 E               /C/E             C
D                /D               D
 F               /D/F             D
 G               /D/G             D
E                /E               E
F                /F               F
G                /G               G
A                /A               A
 B               /A/B             A
  D              /A/B/D           A
   F             /A/B/D/F         A
   G             /A/B/D/G         A
 C               /A/C             A
  E              /A/C/E           A

19 rows selected.

是不是有一种“寻根问祖”的韵味在里边。在遍历的过程中每一个子树根节点的X列信息都被清晰的得到了。

4.为了更加明显的体现出CONNECT_BY_ROOT是一个一元运算符,我们可以将上面的“CONNECT_BY_ROOT x”改写成为“CONNECT_BY_ROOT(x)”。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path,CONNECT_BY_ROOT(x) from t connect by prior y=z;

TREE             TREE_PATH        CONNECT_BY
---------------- ---------------- ----------
B                /B               B
 D               /B/D             B
  F              /B/D/F           B
  G              /B/D/G           B
C                /C               C
 E               /C/E             C
D                /D               D
 F               /D/F             D
 G               /D/G             D
E                /E               E
F                /F               F
G                /G               G
A                /A               A
 B               /A/B             A
  D              /A/B/D           A
   F             /A/B/D/F         A
   G             /A/B/D/G         A
 C               /A/C             A
  E              /A/C/E           A

19 rows selected.

5.小结
在复杂的层次查询中一切可以确定数据根源的信息都是值得推崇的,CONNECT_BY_ROOT这个一元运算符便是其中之一。

Good luck.

secooler
10.01.02

-- The End --

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

请登录后发表评论 登录
全部评论
OCM联盟( Oracle Certified Master Union)是由侯圣文(ACE总监)发起的一个公益组织,旨在为每一个OCM大师提供一个可以继续展示自己才华,技术和实力的平台。

注册时间:2007-05-27

  • 博文量
    799
  • 访问量
    8406979