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;
表(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;