编写SQL查询:从Employee表获取员工及上下级管理者完整信息
员工层级信息查询SQL语句
需求说明
需要编写SQL查询语句,输出以下字段:
- EmpId:员工ID
- EmpName:员工姓名
- ManagerId:直属经理ID
- ManagerName:直属经理姓名
- TopManagerId:最高层级经理ID(公司/部门最顶端管理者)
- TopManagerName:最高层级经理姓名
输出格式示例:
EmpId,EmpName,ManagerId,ManagerName,TopManagerId,TopManagerName
已知表结构
Employee表包含3个字段:
EmpId,EmpName,ManagerId
其中ManagerId为员工的直属经理ID,顶端管理者的ManagerId为NULL。
SQL查询语句
WITH RecursiveEmployees AS ( -- 从顶端管理者开始(无上级的员工),初始顶端经理为自身 SELECT EmpId, EmpName, ManagerId, EmpId AS TopManagerId, EmpName AS TopManagerName FROM Employee WHERE ManagerId IS NULL UNION ALL -- 递归遍历所有下属员工,继承顶端经理信息 SELECT e.EmpId, e.EmpName, e.ManagerId, re.TopManagerId, re.TopManagerName FROM Employee e JOIN RecursiveEmployees re ON e.ManagerId = re.EmpId ) -- 关联直属经理的姓名,输出最终结果 SELECT re.EmpId, re.EmpName, re.ManagerId, m.EmpName AS ManagerName, re.TopManagerId, re.TopManagerName FROM RecursiveEmployees re LEFT JOIN Employee m ON re.ManagerId = m.EmpId ORDER BY re.EmpId;
语句说明
- 递归CTE(RecursiveEmployees):从无上级的顶端管理者出发,向下递归遍历所有下属员工,将顶端管理者的ID和姓名传递给每一层下属,确保每个员工都能关联到所在分支的最高层级经理。
- 左连接获取直属经理姓名:通过
LEFT JOIN关联Employee表,根据ManagerId获取直属经理姓名,避免因员工自身是顶端管理者(无直属经理)导致记录丢失。 - 排序:最终结果按员工ID排序,便于查看。
内容的提问来源于stack exchange,提问作者Jithesh K Ramesh
相关产品推荐
相关产品推荐

