我有如下一張表:
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, 神奇吧!