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;