by connect nocycle oracle_connect by nocycle问题

新手一直有一个问题没弄明白,不知道在哪个地方理解错了,麻烦各位前辈指点一下,不胜感激。以前发了一个贴,由于没有表述明白,前辈没理解我的意思,所以这次详细整理一下:

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,

我始终不明白我在哪个地方理解错了,麻烦前辈指点一下,谢谢。如果还不懂我的意思,也请指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值