例子:
SELECT (SELECT ID FROM TEST WHERE LEVEL = A.LV START WITH ID=A.ID CONNECT BY ID = PRIOR F_ID) F_ID,ID FROM (SELECT ID,LEVEL LVFROM TEST CONNECT BY ID = FID) A
查询Test表里面所以字节点的父节点
10g 的新特性
第一个伪列是CONNECT_BY_ISLEAF,用来标识查询结果中的树叶信息
对于所有包含分支的节点,CONNECT_BY_ISLEAF伪列返回0,如果是不包含分支的页节点,则返回1。
SQL> SELECT ID, CONNECT_BY_ISLEAF FROM TEST ID CONNECT_BY_ISLEAF 已选择13行。
2 START WITH FID = 0
3 CONNECT BY PRIOR ID = FID;
---------- -----------------
1 0
2 0
201 1
202 1
203 1
204 1
205 1
206 1
207 1
3 0
301 1
302 1
303 1
第二个伪列是CONNECT_BY_ISCYCLE,用来标识CONNECT BY中是否存在循环的情况。和这个伪列一起说明的还有一个NOCYCLE命令,这个命令允许CONNECT BY碰到循环的情况下可以跳出循环继续执行。
这个功能十分有用。有时候会将树的根节点的父ID设置为自己,但是这种情况在10g以前的版本利用树状查询就会报错,而现在使用NOCYCLE命令可以轻易的解决这个问题。
SQL> UPDATE TEST SET FID = 1 WHERE ID = 1; 已更新 1 行。 SQL> COMMIT; 提交完成。 SQL> SELECT ID FROM TEST START WITH ID = 1 CONNECT BY PRIOR ID = FID;
未选定行 SQL> SELECT ID, CONNECT_BY_ISCYCLE FROM TEST ID CONNECT_BY_ISCYCLE
ERROR:
ORA-01436: 用户数据中的 CONNECT BY 循环
2 START WITH ID = 1
3 CONNECT BY NOCYCLE PRIOR ID = FID;
---------- ------------------
1 1
2 0
201 0
202 0
203 0
204 0
205 0
206 0
207 0
3 0
301 0
302 0
303 0
已选择13行。 10G树状查询的新增功能用法简单,而且使得树状查询使用更加方便。