新手一直有一个问题没弄明白,不知道在哪个地方理解错了,麻烦各位前辈指点一下,不胜感激。以前发了一个贴,由于没有表述明白,前辈没理解我的意思,所以这次详细整理一下:
SQL> select * from tmp;
L R
-- --
a1 a3
a3 a1
SQL> select connect_by_root L L_ROOT, L, R, connect_by_iscycle
2 from tmp
3 connect by nocycle L = prior R
4 ;
L_ROOT L R CONNECT_BY_ISCYCLE
------ -- -- ------------------
a1 a1 a3 0
a1 a3 a1 1
a3 a3 a1 0
a3 a1 a3 1
针对上面结果,我说明一下我关于connect by nocycle的理解,请各位前辈看一下我是否理解有错:
理解一:对于没有START WITH的CONNECT BY语句,TMP表中的每行都会作为层次查询的根结点。
理解二:针对于理解一,我拿查询结果的前两行作分析。对于TMP中的第一行数据(a1 a3),基于理解一,所以查询结果第一行(a1 a1 a3 0)自然会出现在查询结果中。
对于 L = prior R 的理解是:上一行的R的值等于当前行的L值,所以TMP中的第二行数据(a3 a1)满足此条件,所以此条数据应该在查询结果中,即查询结果第二行(a1 a3 a1 1 ),
关于第二行的CONNECT_BY_ISCYCLE值为1,我的理解是针对条件L = prior R,他的下一条数据又回到TMP表中的第一行数据(a1 a3)了,由于nocycle的作用,所以在此中断了循环。
所以查询结果里数据的来源我是这样分析出来的,不知道我的理解有错误没。
如果没有错误,我们继续(问题就在下面):
我在TMP中再插入两条数据。
SQL> select * from tmp;
L R
-- --
a1 a3
a3 a1
a3 a4
a4 a3
SQL> select connect_by_root L L_ROOT, L, R, connect_by_iscycle
2 from tmp
3 connect by nocycle L = prior R
4 ;
L_ROOT L R CONNECT_BY_ISCYCLE
------ -- -- ------------------
a1 a1 a3 0
a1 a3 a1 1
a1 a3 a4 1
a3 a3 a1 0
a3 a1 a3 1
a3 a3 a4 1
a3 a3 a4 0
a3 a4 a3 1
a3 a3 a1 1
a4 a4 a3 0
a4 a3 a1 1
a4 a3 a4 1
基于上面的理解,我在理解这结果时,就理解不通了,以TMP中的第一行数据(a1 a3)为例,我认为他的结果应该有4条。如下:
L_ROOT L R CONNECT_BY_ISCYCLE
------ -- -- ------------------
a1 a1 a3 0
a1 a3 a1 1
a1 a3 a4 0
a1 a4 a3 1
我的理解是:TMP中第二行数据(a3 a1)与第一行满足 L = prior R,因为第二行与第一行重复循环,所以CONNECT_BY_ISCYCLE的值为1,
TMP中第三行数据(a3 a4)与第一行满足 L = prior R,因为第三行此时不与其他行重复循环,所以CONNECT_BY_ISCYCLE的值为0,
TMP中第四行数据(a4 a3)与第三行满足 L = prior R,因为第四行与第三行重复循环,所以CONNECT_BY_ISCYCLE的值为1,
我始终不明白我在哪个地方理解错了,麻烦前辈指点一下,谢谢。如果还不懂我的意思,也请指出。