【SQL】一個簡單的查詢所有層級(直到頂層)的sql語句


我有如下一張表:

table: employee
        id(員工編號)
        name(姓名)
        manager_id(直接領導的員工編號)

數據如下:

id name manager_id
1 liuBei NULL
2 guanYu 1
3 zhangFei 1
4 zhouCang 2
5 guanPing 2
6 peiYuanShao 4
7 zhangXiu 6

 

從這張表中,我們可以看出:

liuBei 有兩個直接下屬 guanYu 和 zhangFei, 並且 liuBei 是最高領導。

guanYu 有兩個直接下屬 zhouCang 和 guanPing

zhangFei 沒有直接下屬

zhouCang 有一個直接下屬 peiYuanShao

guanPing 沒有直接下屬

peiYuanShao 有一個直接下屬 zhangXiu

zhangXiu 沒有直接下屬

 

從這里我們知道,其中最長的這條關系就是 zhangXiu -> peiYuanShao -> zhouCang -> guanYu -> liuBei

 

現在有一個問題,我們只知道一個員工的編號,需要查詢出該員工的所有上級領導鏈,怎用用最少的代碼實現呢?。 比如,我們只知道 zhangXiu 的員工編號是 7 ,怎么才能用最少的代碼查詢出這條關系鏈(zhangXiu -> peiYuanShao -> zhouCang -> guanYu -> liuBei)呢? 

 

答案揭曉:

with EmployeeTree  AS
(
    SELECT * FROM employee WHERE ID = 7
    UNION ALL
    SELECT a.* FROM EmployeeTree , employee as a WHERE EmployeeTree.manager_id = a.id
)
SELECT * FROM EmployeeTree;

就是這個SQL語句,就能查詢出 zhangXiu 完整的領導關系鏈,sql語句中雖然沒有直接寫  for  循環,但是它是會循環查詢的,直到查詢的條件為   EmployeeTree.manager_id = a.id  的查詢語句查不到數據為止。

輸出如下:

id    name    manager_id
7    zhangXiu    6
6    peiYuanShao    4
4    zhouCang    2
2    guanYu    1
1    liuBei    NULL

上面的結果就是 zhangXiu -> peiYuanShao -> zouCang -> guanYu -> LiuBei,    神奇吧!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM