如何在查询Wage员工数据时同时包含其Manager数据
需求与解决方案
我有一张名为Employees的表,结构及数据如下:
| ID | Full Name | Employee Type | Employment Rate | Manager ID |
|---|---|---|---|---|
| 143 | Sam Smith | Full Time | Wage | 146 |
| 144 | Jay Reddy | Part Time | Wage | 146 |
| 145 | Nick Young | Full Time | Wage | 146 |
| 146 | Trevor Simm | Full Time | Salary | 147 |
| 147 | Justin Peters | Part Time | Salary | 147 |
| 148 | Lisa Howard | Full Time | Salary | 140 |
| 149 | Nicky West | Full Time | Salary | 140 |
| 150 | Gemma Yu | Full Time | Wage | 146 |
| 151 | Sally Zhang | Part Time | Salary | 140 |
| 152 | James Hillary | Full Time | Wage | 146 |
| 153 | Nikita Shaw | Full Time | Wage | 146 |
需要编写一条SQL查询,返回所有Employment Rate为Wage的员工,同时包含这些员工对应的管理者数据,预期返回结果如下:
| ID | Full Name | Employee Type | Employment Rate | Manager ID |
|---|---|---|---|---|
| 143 | Sam Smith | Full Time | Wage | 146 |
| 144 | Jay Reddy | Part Time | Wage | 146 |
| 145 | Nick Young | Full Time | Wage | 146 |
| 146 | Trevor Simm | Full Time | Salary | 147 |
| 147 | Justin Peters | Part Time | Salary | 147 |
| 150 | Gemma Yu | Full Time | Wage | 146 |
| 152 | James Hillary | Full Time | Wage | 146 |
| 153 | Nikita Shaw | Full Time | Wage | 146 |
目前已写出查询Wage员工的基础SQL语句,需要修改以同时包含对应管理者数据:
Select * From Employees Where [Employment Rate] = 'Wage'
解决方案
方法一:使用UNION ALL合并结果(贴合预期需求)
先查询所有Wage员工,再关联查询他们的直接管理者并去重,避免重复的管理者记录:
-- 先获取所有Employment Rate为Wage的员工 SELECT * FROM Employees WHERE [Employment Rate] = 'Wage' UNION ALL -- 获取这些员工对应的直接管理者,去重避免重复返回同一个管理者 SELECT DISTINCT m.* FROM Employees e JOIN Employees m ON e.[Manager ID] = m.ID WHERE e.[Employment Rate] = 'Wage'
方法二:递归CTE处理多层级管理者(如需包含所有上级)
如果存在多级管理(比如管理者还有自己的上级),可以用递归CTE一次性获取所有关联层级的管理者:
WITH EmployeeHierarchy AS ( -- 基础数据:所有Wage员工 SELECT * FROM Employees WHERE [Employment Rate] = 'Wage' UNION ALL -- 递归获取当前成员的上级管理者,排除自引用循环 SELECT m.* FROM EmployeeHierarchy e JOIN Employees m ON e.[Manager ID] = m.ID WHERE m.ID <> e.ID ) SELECT DISTINCT * FROM EmployeeHierarchy ORDER BY ID;
说明:从预期结果来看,方法一更匹配需求,它仅返回Wage员工和他们的直接管理者,且通过DISTINCT确保同一个管理者只出现一次。
内容的提问来源于stack exchange,提问作者BP1109
相关产品推荐
相关产品推荐

