Connect by 语法了解

    CONNECT BY 语法相信大家可以从网上找到很多例子,在这里就不多说了。来描述一下我遇到的问题。
    表(fnd_flex_value)中的数据是这样的:
    TYPE_ID    PARENT_VALUE   CHILD_VALUE
    139048      2701            270101
    139048      270101          27010101
 
    139058      2701            270101
    139058      270101          27010101

    执行如下语句:
    select * from fnd_flex_value ffv
     where  type_id=139048
     start with child_value=270101
     connect by prior child_value=ffv.parent_value;

  
    执行结果为:
     TYPE_ID    PARENT_VALUE   CHILD_VALUE
    139048      2701            270101
    139048      270101          27010101
    139048      270101          27010101


    最后一条记录重复了两次,我们想得到的结果应该只有前两条,那么第三条是怎么得到的呢,经过研究,个人认为可能是因为如下的原因(如果不正确,请大家改正,呵呵):
    在这段SQL的执行的时候,先执行了CONNECT BY,G最后才执行WHERE条件。
    那么循环得到的结果为:
    第一次循环(从start with child_value=2701)开始找数据:
    (1.1)  139048   2701  270101
    (1.2)  139058   2701  270101

    第二次循环(从(1.1)开始找数据:
    (2.1)  139048   270101  27010101
    (2.2)  139058   270101  27010101

    第三循环(从(1.2)开始)找数据:
    (3.1)  139048  270101   27010101
    (3.2)  139058  270101   27010101


    退出循环,最后执行where type_id=139048
    得到三条记录。

    如果想得到正确的结果,SQL语句应改为
     select * from
    (select * from  fnd_flex_value where type_id=139048)ffv
     start with child_value=270101
     connect by prior child_value=ffv.parent_value;

   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值