|
不知道现在回复是不是有一点晚,我想现在你肯定理解这个connect by level<x的写法了
它其实是以任意一条记录为根,然后寻找原集合中任意一条记录为下一节点,周而复始,直到level<x不成立时方终止递归
加上level<x的约束后,level就不会无限制的扩大。
14:07:48 SCOTT@Z3> select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by level<4;
ID NAME LEVEL SC ROOTNAME
---------- ---------- ---------- -------------------- --------------------
9 96 1 ,96 96
9 96 2 ,96,96 96
9 96 3 ,96,96,96 96
123 22 3 ,96,96,22 96
123 22 2 ,96,22 96
9 96 3 ,96,22,96 96
123 22 3 ,96,22,22 96
123 22 1 ,22 22
9 96 2 ,22,96 22
9 96 3 ,22,96,96 22
123 22 3 ,22,96,22 22
123 22 2 ,22,22 22
9 96 3 ,22,22,96 22
123 22 3 ,22,22,22 22
14 rows selected.
如果只加上 prior name<>name的条件,无nocycle,则oracle没有办法限制下一个路径中的对象和以前的不重复,所以就会报错。
14:10:31 SCOTT@Z3> select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by level<4 and prior name<>name;
ERROR:
ORA-01436: 用户数据中的 CONNECT BY 循环
no rows selected
但如果将level<4改为level<3则可以执行成功,不指定nocycle也能成功,这是由于数据的特点导致的。
14:10:44 SCOTT@Z3> select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by level<3 and prior name<>name;
ID NAME LEVEL SC ROOTNAME
---------- ---------- ---------- -------------------- --------------------
9 96 1 ,96 96
123 22 2 ,96,22 96
123 22 1 ,22 22
9 96 2 ,22,96 22
select id,name,level, sys_connect_by_path(name,',') sc, connect_by_root name rootname from one connect by nocycle level<4 and prior name<>name;
这一句的结果和上面相同 |
|