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