2013-01-31 28 views
1

獲得的祖先,我有一個表的結構如下:從Oracle SQL表

CHILD_ID | PARENT_ID 

兩個柱子均是整數。

我試圖讓一個給定'節點'的所有祖先。我有最頂級的ID,我想選擇一個包含所有孩子ID的表。

CHILD_ID | PARENT_ID 
1   2 
6   12 
2   3 
3   4 
9   82 

尋找祖先4

應該返回

ID 
3 
2 
1 

這將如何在Oracle做?

它可以在沒有存儲過程的情況下完成嗎?

一如既往,感謝您的高級時間。

+0

這將是後代,而不是祖先。 – GriffeyDog

+0

你說的對。不幸的是,這就是它在我正在使用的數據模型中的命名方式。無法改變它。 –

回答

4

爲了滿足您的輸出的預期,查詢可以是這樣的:

-- sample of data 
SQL> with t1(CHILD_ID, PARENT_ID) as(
    2 select 1, 2 from dual union all 
    3 select 6, 12 from dual union all 
    4 select 2, 3 from dual union all 
    5 select 3, 4 from dual union all 
    6 select 9, 82 from dual 
    7 ) -- actual query 
    8 select child_id 
    9 from t1 
10 start with parent_id = 4 
11 connect by parent_id = prior child_id 
12 ; 

    CHILD_ID 
---------- 
     3 
     2 
     1 
+1

這是很多硬編碼值。 –

+0

有沒有辦法做到這一點沒有硬編碼值?我會對公用表格表達做更多的研究。 –

+2

@ chrisg32你在'with'子句中看到的那些「硬編碼」值僅僅是爲了演示(爲了不創建表並用數據填充它,我們可以使用'with'子句)。實際查詢從第8行開始。因此,請查詢,用您的表名替換「t1」並試一試。 –

0

最好的解決方案是做鄰接樹或嵌套集合樹。然後,您可以執行超快速操作,從單個查詢返回子樹。最糟糕的解決方案是採取一個光標並逐步瀏覽記錄,並試着通過每個記錄的父母進行遞歸。

嵌套集合樹是驚人的,唯一的缺點是他們需要重新編號時,他們已經被改變。但是,如果您需要計算總量,例如,他們的速度完全是香蕉。

Wikipedia on the Nested Set Model
Joe Celko's Explanation (excellent)