有关层次查询之前的文章参考如下。
【层次查询】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 --
【层次查询】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/