2015-04-28 29 views
0

我試圖打印所有沒有下屬的員工。沒有下屬的員工

enter image description here

我一直在思考一個樹數據結構。實際上,大多數員工都有次級(稱爲經理)。唯一沒有subordonate的是葉子(他們沒有任何孩子)。

但是,我不明白我該如何從樹中選擇樹葉。

--following prints employees without manager. 
    SELECT e.employee_id, e.last_name, e.first_name 
    FROM employees e 
    WHERE e.employee_id = (SELECT employee_id FROM employees WHERE manager_id IS NULL AND employee_id = e.employee_id); 
+0

使用[先前連接](http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm)並檢查葉節點狀態。 [如果當前行是由CONNECT BY條件定義的樹的葉子,則CONNECT_BY_ISLEAF僞列將返回1。否則它將返回0.此信息指示是否可以進一步擴展給定的行以顯示更多的層次結構。](http://docs.oracle.com/cd/B12037_01/server.101/b10759/pseudocolumns001.htm#i1007332 ) – xQbert

+0

[從一個節點獲得所有最後一級的孩子(樹葉)(層次查詢Oracle 11G)](http://stackoverflow.com/questions/21671568/get-all-last-level-children-leafs-from -a-節點hierarhical查詢 - 甲骨文11克) – xQbert

回答

3

總之,要選擇所有的員工,誰不作爲其他員工的經理。這意味着,您希望選擇這樣的員工,其employee_id未被用作任何其他員工的manager_id

試試這個:

SELECT * 
    FROM employees e 
WHERE NOT EXISTS (SELECT 1 
        FROM employees e2 
        WHERE e2.manager_id = e.employee_id) 
1

您可以通過外部做這個連接:

SELECT e.employee_id, e.last_name, e.first_name 
FROM 
    employees e 
    LEFT JOIN employees sub 
    ON e.employee_id = sub.manager_id 
WHERE sub.manager_id IS NULL 

過濾條件只選擇那些在右表中沒有匹配行的左表的行。

這比通過相關子查詢進行篩選要好,因爲後者可能需要分別爲每個員工行執行子查詢。 (如果查詢規劃避免了,這將是通過將其轉化爲外連接的等效)。

相關問題