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

有关层次查询之前的文章参考如下。
【层次查询】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博客 ” ,链接:http://blog.itpub.net/519536/viewspace-624114/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/519536/viewspace-624114/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值