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

备注:测试数据库版本为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从小工到专家之路,#,MySQL,CookBook,数据库,mysql,with递归,父子关系,级联)