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

  • 相关阅读:
    内存映射文件原理探索(转)
    inux内存映射和共享内存理解和区别
    MySQL中的sleep函数介绍
    flask源码解析之上下文为什么用栈
    linux system函数详解
    Python中的可迭代对象、迭代器和生成器,协程的异同点
    GB2312汉字区位码、交换码和机内码转换方法 (ZT)
    pthread_cond_signal该放在什么地方?
    IPC介绍——10个ipcs例子
    lsof
  • 原文地址:https://www.cnblogs.com/HDK2016/p/12423858.html
Copyright © 2020-2023  润新知