如何用MySQL递归CTE实现员工向所有层级领导的累计汇报关系查询?
问题:获取员工全层级向上汇报关系
需要生成每位员工向上至所有层级领导的汇报关系记录,而非仅直接上下级。例如,若CEO外有500名员工,CEO的汇报记录需包含这500行。
示例员工表
EmployeeId, ManagerId, Name 1, NULL, TheGeneral 2, 1, Bob 3, 1, Christelle 4, 1, Wilfer 5, 2, Hailey 6, 2, George 7, 3, Mary 8, 4, Henry 9, 5, Wendy
期望输出
ReportIntoManagerId, ManagerialLevel, EmployeeId, Name NULL, 1, 1, TheGeneral 1, 1, 2, Bob 1, 1, 3, Christelle 1, 1, 4, Wilfer 1, 1, 5, Hailey 1, 1, 6, George 1, 1, 7, Mary 1, 1, 8, Henry 1, 1, 9, Wendy 2, 2, 5, Hailey 2, 2, 6, George 2, 2, 9, Wendy 3, 2, 3, Christelle 3, 2, 7, Mary 4, 2, 4, Henry 5, 3, 9, Wendy
已知需使用递归CTE,但不知如何实现这种累计层级的汇总,请求技术实现方案。
解决方案:递归CTE实现全层级汇报关系
可以通过递归CTE来实现,核心思路是从每个员工出发,向上遍历所有直属领导,同时记录当前的汇报层级,最终将所有遍历结果合并。
SQL实现代码
WITH RecursiveReporting AS ( -- 锚点成员:初始记录每位员工的直接汇报关系(层级1) SELECT ManagerId AS ReportIntoManagerId, 1 AS ManagerialLevel, EmployeeId, Name FROM Employee UNION ALL -- 递归成员:向上遍历员工的上级领导,层级递增 SELECT e.ManagerId AS ReportIntoManagerId, rr.ManagerialLevel + 1 AS ManagerialLevel, rr.EmployeeId, rr.Name FROM RecursiveReporting rr JOIN Employee e ON rr.ReportIntoManagerId = e.EmployeeId -- 终止条件:当上级领导为NULL时停止(即到最高层级) WHERE e.ManagerId IS NOT NULL ) -- 合并所有层级的汇报记录,并按指定规则排序 SELECT * FROM RecursiveReporting ORDER BY ReportIntoManagerId, ManagerialLevel, EmployeeId;
逻辑说明
- 锚点成员:先取出所有员工的直接汇报关系,层级标记为1。其中CEO(EmployeeId=1)的ManagerId为NULL,对应输出中的第一条记录。
- 递归成员:将递归CTE中的
ReportIntoManagerId作为员工ID,关联员工表找到其上级领导,同时把层级加1,直到上级领导为NULL时停止递归。 - 最终查询:将所有递归生成的记录合并,按
ReportIntoManagerId、ManagerialLevel、EmployeeId排序后输出,即可得到每位员工向上所有层级的汇报关系。
内容的提问来源于stack exchange,提问作者Brad Davis
相关产品推荐
相关产品推荐

