2013-10-12 48 views
2

晚上好,我需要幫助,試圖從我的一個層次表(紅色圓圈)中檢索中層管理者,他們不是根節點,也不是葉節點。分層查詢(如何檢索中間節點)

層次結構圖/數據 Hierarchical Chart Data

我能夠用我的查詢

select level, first_name ||' '|| last_name "FullName" 
from more_employees 
where employee_id not in (select NVL(manager_id, 0) from more_employees) 
start with employee_id = 1 
CONNECT by prior employee_id = manager_id; 
檢索所有葉子節點

Result

我敢肯定,我應該使用關鍵字「in」在我的where子句中,但不斷得到不同的結果。

回答

2

可以使用CONNECT_BY_IS_LEAF僞列此。

select level, first_name ||' '|| last_name "FullName" 
from more_employees 
where connect_by_isleaf = 0 and manager_id is not null 
start with employee_id = 1 
connect by prior employee_id = manager_id; 

你也可以用它來獲取所有的葉子:

select level, first_name ||' '|| last_name "FullName" 
from more_employees 
where connect_by_isleaf = 1 
start with employee_id = 1 
connect by prior employee_id = manager_id; 

這很有可能快於您的解決方案子選擇

下面是一個SQLFiddle例如:http://sqlfiddle.com/#!4/511d9/2

+0

只是好奇。你爲什麼認爲它比子選擇速度更快? –

+0

@ValentinKuzub:因爲只需要對錶格進行一次訪問。子選擇會導致對同一個表的兩個查詢(我在談論問題中的原始查詢以獲取所有葉子,而不是您的答案) –

+0

謝謝,我會牢記這一點。 –

2

像這樣的東西應該工作,我相信

select * from more_employees m1 where manager_id is not null 
and exists (select 1 from more_employees m2 where m2.manager_id=m1.employee_id) 
+1

這是正確的(也是最簡單的)解決方案。 「中間」節點有一個父母指向的地方,以及指向他們的孩子。這是您不需要遞歸的少數情況之一,只需檢查「NULL指針」即可。 – wildplasser

+0

謝謝瓦倫丁。 –