如何查询Supervisor_ID为123管辖分支下的所有员工及下级主管
你这个需求是典型的多层级递归遍历树形结构数据场景,主流关系型数据库都有对应的实现方案,下面给你两种最常用的写法:
方案1:通用递归CTE写法(支持MySQL 8.0+、PostgreSQL、SQL Server等绝大多数新数据库)
思路是先锚定直接向123汇报的一级下属,再循环遍历这些下属的下级,直到没有新的下级员工为止:
WITH RECURSIVE subordinate_tree AS ( -- 锚点:查询直属123的一级员工 SELECT Employee_ID FROM employee_table WHERE Supervisor_ID = '123' UNION ALL -- 递归:每次关联上一级的员工ID,拉取其下属 SELECT e.Employee_ID FROM employee_table e INNER JOIN subordinate_tree st ON e.Supervisor_ID = st.Employee_ID ) -- 输出去重后的所有员工ID SELECT DISTINCT Employee_ID FROM subordinate_tree;
执行后返回的结果就是你需要的001、178、002、154、003,不会关联到主管为201的004。
方案2:旧版Oracle专用CONNECT BY语法
如果用的是不支持CTE的旧版Oracle,可以用原生层级查询语法:
SELECT Employee_ID FROM employee_table START WITH Supervisor_ID = '123' CONNECT BY PRIOR Employee_ID = Supervisor_ID;
如果是低于8.0的MySQL版本,没有原生递归语法支持,层级不超过5级的场景可以写多层自关联实现,层级不确定的话优先升级数据库版本或者用存储过程循环实现即可。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

