暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 只是甲 2021-02-26
930

备注:测试数据库版本为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)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论