如何在SQL递归CTE中同时查询多个EmployeeID并返回结果
如何在递归CTE中同时查询多个员工的上级关系
嘿,这个问题很好解决!要在那篇递归CTE的员工查询示例里同时获取多个EmployeeID的上级关系,只需要调整递归CTE的锚点成员(也就是初始SELECT语句)的WHERE条件,再添个小字段区分不同的查询分支就行,我给你具体演示下:
假设你的员工表结构是Employees,包含EmployeeID(员工ID)、ManagerID(上级ID)、EmployeeName(员工姓名)这些核心字段,我们可以这么写:
WITH RecursiveEmployees AS ( -- 锚点成员:选中所有要查询的起始员工,新增字段标记根节点 SELECT EmployeeID, ManagerID, EmployeeName, 1 AS Level, -- 标记层级:1是起始员工,2是直接上级,以此类推 EmployeeID AS RootEmployeeID -- 用来区分每条记录属于哪个起始员工的分支 FROM Employees WHERE EmployeeID IN (16, 18, 22) -- 这里替换成你要查询的多个员工ID UNION ALL -- 递归成员:向上递归查找上级 SELECT e.EmployeeID, e.ManagerID, e.EmployeeName, re.Level + 1 AS Level, re.RootEmployeeID -- 传递根节点ID,保持分支关联 FROM Employees e JOIN RecursiveEmployees re ON e.EmployeeID = re.ManagerID ) -- 最终查询结果,按起始员工和层级排序,方便查看 SELECT RootEmployeeID AS 起始员工ID, Level AS 层级, EmployeeID AS 员工ID, EmployeeName AS 员工姓名, ManagerID AS 上级ID FROM RecursiveEmployees ORDER BY RootEmployeeID, Level;
关键要点说明:
- 修改WHERE子句:把原来的
WHERE EmployeeID = 16改成WHERE EmployeeID IN (...),括号里放你要查询的所有员工ID就行。 - 新增RootEmployeeID字段:这个字段非常关键!因为递归查询会把所有员工的上级链混在一起,有了它你就能清楚区分每一条记录属于哪个起始员工的分支。
- 递归传递根节点:在递归成员里一定要把
RootEmployeeID继承下去,这样整个递归链都会和对应的起始员工绑定。 - 排序优化:最后按
RootEmployeeID和Level排序,能让每个起始员工的上级关系按层级整齐排列,看起来更清晰。
如果你的需求是把每个员工的上级链拼接成一个字符串(比如“CEO → 部门经理 → 员工16”),也可以调整递归逻辑实现:
WITH RecursiveEmployees AS ( SELECT EmployeeID, ManagerID, CAST(EmployeeName AS VARCHAR(MAX)) AS HierarchyPath, EmployeeID AS RootEmployeeID FROM Employees WHERE EmployeeID IN (16, 18, 22) UNION ALL SELECT e.EmployeeID, e.ManagerID, CAST(e.EmployeeName + ' → ' + re.HierarchyPath AS VARCHAR(MAX)), re.RootEmployeeID FROM Employees e JOIN RecursiveEmployees re ON e.EmployeeID = re.ManagerID ) -- 只取每个分支的最顶层上级(也就是没有上级的员工) SELECT RootEmployeeID AS 起始员工ID, HierarchyPath AS 上级关系链 FROM RecursiveEmployees WHERE ManagerID IS NULL ORDER BY RootEmployeeID;
内容的提问来源于stack exchange,提问作者RaelB
相关产品推荐
相关产品推荐

