zoukankan      html  css  js  c++  java
  • 【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,    神奇吧!

  • 相关阅读:
    VS Code 使用笔记
    Haskell语言开发工具
    Haskell语言学习笔记(81)Data.Typeable
    Haskell语言学习笔记(80)req
    Haskell语言学习笔记(79)lambda演算
    Haskell语言学习笔记(78)fix
    2733: [HNOI2012]永无乡
    牛课练习赛17
    bzoj3758. 数数
    【BZOJ1786】[Ahoi2008]Pair 配对
  • 原文地址:https://www.cnblogs.com/HDK2016/p/12423858.html
Copyright © 2011-2022 走看看