2012-05-22 48 views
2

我在Oracle11g中有一個像(id,parent_id)結構的表。在Oracle中的分層查詢

id parent_id 
--------------- 
1  (null) 
2  (null) 
3  1 
4  3 
5  3 
6  2 
7  2 

我想查詢它來獲取分層鏈接到這些ID的所有行,所以結果應該是:

root_id id parent_id 
------------------------ 
1  3  1 
1  4  3 
1  5  3 
2  6  2 
2  7  2 
3  4  3 
3  5  3 

我已經與connect by掙扎和start with相當一段時間,和所有我能得到的是結果的一部分,我想用類似的查詢:

select connect_by_root(id) root_id, id, parent_id from my-table 
start with id=1 
connect by prior id = parent_id 

我想不使用任何for循環來獲得我的完整結果。

任何想法?

最好的問候, 傑羅姆Lefrère

PS:第一個回答後可進行編輯,我注意到我已經忘記了一些我想要的結果...

回答

3

的您發佈的查詢缺少from子句,並在connect_by_root之外留下下劃線,但我會假設這些並不是您問題的實際來源。

下面的查詢爲您提供您正在尋找的結果是:

select * from (
    select connect_by_root(id) root_id, id, parent_id 
    from test1 
    start with parent_id is null 
    connect by prior id = parent_id) 
where root_id <> id 

的中心問題是,你指定一個特定的值開始從,而當指定的方式來識別根行。將id = 1更改爲parent_id is null可以返回表格的全部內容。

我還添加了外部查詢來篩選結果集中的根行,該結果集在您的問題中沒有提到,但顯示在您想要的結果中。

SQL Fiddle Example


評論迴應:

在提供的版本中,你得到的id = 3後裔,但不是以這樣的方式3是根。這是因爲我們從絕對根源入手。解決這是很簡單,只是省略start with條款:

SELECT * 
FROM 
    (SELECT connect_by_root(id) root_id, 
      id, 
      parent_id 
    FROM test1 
CONNECT BY 
    PRIOR id = parent_id) 
WHERE root_id <> id 

SQL Fiddle Example

+0

感謝您的回答。我編輯了我的帖子,所以'from'和缺少的下劃線不再是問題。你的查詢讓我有絕對的根。我想也得到'id = 3'行的後代 – Jerome

2

試試這個:

select connect_by_root(id) root_id, id, parent_id 
from your_table 
start with parent_id is null 
connect by prior id = parent_id 
+0

謝謝您的回答這是完美的,直到我發現我忘了一些我想要的結果:我還想是不是線絕對的根(見我原來的帖子的最後2個結果) – Jerome

+0

然後只是刪除'開始parent_id爲空'部分 –

+0

它似乎工作。只需要在我更復雜的桌子上查看,以確保 – Jerome