2014-10-18 32 views
2

在下面的例子甲骨文CONNECT BY遞歸孩子家長的查詢,包括自我引用

id parent_id 
A A 
B A 
C B 

select id, parent_id 
from table 
start with id = 'A' 
connect by nocycle parent_id = prior id 

我得到

A A 
B A 
C B 

在我的數據庫中,我有幾百萬行的表中,並最終母公司深層次和廣泛的層次結構,我對所有的孩子都不感興趣。我可以派生出我感興趣的孩子。因此,我想在頭上打開查詢並將START WITH與兒童ID相提供。然後我想遞歸地輸出父節點,直到到達頂端。在我的情況下,頂部是id和parent_id相等的地方。這是我正在嘗試,但我無法讓它顯示頂級父。

select id, parent_id 
from table 
START WITH id = 'C' 
CONNECT BY nocycle id = PRIOR parent_id 

這給了我

C B 
B A 

它不輸出A A.是否有可能做到這一點?我希望做的不是將parent_id顯示爲輸出中的單獨列,而只是顯示與id相關的名稱。層次然後由訂單隱含。

回答

3

我通過使用WITH子句得到了該結果。

WITH REC_TABLE (ID, PARENT_ID) 
AS 
(
    --Start WITH 
    SELECT ID, PARENT_ID 
    FROM table 
    WHERE ID='C' 

    UNION ALL 
    --Recursive Block 
    SELECT T.ID, T.PARENT_ID 
    FROM table T 
    JOIN REC_TABLE R 
    ON R.PARENT_ID=T.ID 
    AND R.PARENT_ID!=R.ID --NoCycle rule 
) 
SELECT * 
FROM REC_TABLE; 

它似乎也是這樣工作的。

select id, parent_id 
from T 
START WITH id = 'C' 
CONNECT BY id = PRIOR parent_id and parent_id!= prior id; 
--         ^^^^^^^^^^^^^^^^^^^^ 
--          break cycles 

希望它有幫助。

+0

輝煌。非常感謝你。顯然,我不太瞭解PRIOR表達式,但這會幫助我更好地理解它。 – 2014-10-18 15:17:53

+1

@Ftaveras我冒昧地粘貼了整個工作遞歸查詢。 +1 – 2014-10-18 16:16:08