美文网首页
MySQL 为给定父行找到所有子行

MySQL 为给定父行找到所有子行

作者: 只是甲 | 来源:发表于2021-02-26 13:39 被阅读0次

    备注:测试数据库版本为MySQL 8.0

    如需要scott用户下建表及录入数据语句,可参考:
    scott建表及录入数据sql脚本

    一.需求

    找到直接及简介(即JONES下属的下属)为JONES工作的所有员工。

    JONES下属的员工列表如下所示:
    +-------+------+
    | ename | lvl |
    +-------+------+
    | JONES | 1 |
    | SCOTT | 2 |
    | FORD | 2 |
    | ADAMS | 3 |
    | SMITH | 3 |
    +-------+------+

    二.解决方案

    能够移到数的绝对顶部和底部是非常有用的。

    对于这个解决方案,不需要特殊的格式设置。目标只是返回位于员工JONES下属的所有员工,其中包括JONES自己。

    这种类型的查询展示了递归SQL拓展的有用性,如Oracle的connect by和SQL Server/DB 2/MySQL 8.0的with子句等。

    with recursive emp2(ename,empno,lvl) as
    (
    SELECT ename,empno,1 lvl
      from emp 
     where ename = 'JONES'
    union ALL
    select e1.ename,e1.empno,lvl + 1
      from emp e1,emp2 e2
     where e1.mgr = e2.empno
    )
    select ename,lvl from emp2
    

    测试记录:

    mysql> with recursive emp2(ename,empno,lvl) as
        -> (
        -> SELECT ename,empno,1 lvl
        ->   from emp
        ->  where ename = 'JONES'
        -> union ALL
        -> select e1.ename,e1.empno,lvl + 1
        ->   from emp e1,emp2 e2
        ->  where e1.mgr = e2.empno
        -> )
        -> select ename,lvl from emp2;
    +-------+------+
    | ename | lvl  |
    +-------+------+
    | JONES |    1 |
    | SCOTT |    2 |
    | FORD  |    2 |
    | ADAMS |    3 |
    | SMITH |    3 |
    +-------+------+
    5 rows in set (0.01 sec)
    
    

    相关文章

      网友评论

          本文标题:MySQL 为给定父行找到所有子行

          本文链接:https://www.haomeiwen.com/subject/ejoamktx.html