Take a look at GW

【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,    神奇吧!

 

posted @ 2020-03-05 23:32  HDWK  阅读(2270)  评论(0编辑  收藏  举报