我试图弄清楚如何构建一个查询来根据组织层次结构对部门关联进行排序。因此,如果 John
负责销售
,向 Jane
汇报,而 Jane
则向 Mike
汇报。 Jane
应继承 sales
,Mike
也应继承销售部门。
示例表:
+-------+------------+------------+
| Name | Department | Supervisor |
+-------+------------+------------+
| John | Sales | Jane |
| Jane | Supervisor | Mike |
| Fred | Supervisor | Mike |
| Alex | Retail | Fred |
| Mike | Manager | --- |
| Chris | Sales | Jane |
| Dan | Retail | Fred |
+-------+------------+------------+
树会是什么样子:
预期输出:
+-------+------------+
| Name | Department |
+-------+------------+
| John | Sales |
| Jane | Supervisor |
| Jane | Sales |
| Fred | Supervisor |
| Fred | Retail |
| Alex | Retail |
| Mike | Manager |
| Mike | Sales |
| Mike | Retail |
| Chris | Sales |
| Dan | Retail |
+-------+------------+
过去两周我尝试了很多事情,但还没有接近代表我想要的输出。我相信这超出了我的 SQL 知识范围,而且我没有(甚至部分)可以在此处显示的工作代码。
我怎样才能实现这个目标?
CREATE TABLE Employees
(Name varchar(5), Department varchar(10), Supervisor varchar(4))
;
INSERT INTO Employees
(Name, Department,Supervisor)
VALUES
('John', 'Sales', 'Jane'),
('Jane', 'Supervisor', 'Mike'),
('Fred', 'Supervisor', 'Mike'),
('Alex', 'Retail', 'Fred'),
('Mike', 'Manager', '---'),
('Chris', 'Sales', 'Jane'),
('Dan', 'Retail', 'Fred')
;
最佳答案
您可以通过使用递归的 CTE 来完成此操作。
<强> Link on MSDN 了解有关递归 CTE 的更多信息
查询如下
--CREATE TABLE Employees
-- (Name varchar(5), Department varchar(10), Supervisor varchar(4))
--;
--INSERT INTO Employees
-- (Name, Department, Supervisor)
--VALUES
-- ('John', 'Sales', 'Jane'),
-- ('Jane', 'Supervisor', 'Mike'),
-- ('Fred', 'Supervisor', 'Mike'),
-- ('Alex', 'Retail', 'Fred'),
-- ('Mike', 'Manager', '---'),
-- ('Chris', 'Sales', 'Jane'),
-- ('Dan', 'Retail', 'Fred')
--;
WITH user_cte AS (
SELECT Name, Department,Supervisor
FROM Employees
WHERE Department ='Retail' or Department='Sales'
UNION ALL
SELECT
t.Name, ucte.Department,t.Supervisor
FROM Employees t
INNER JOIN user_cte ucte ON ucte.Supervisor = t.Name
)
SELECT DISTINCT Name,Department
FROM user_cte
UNION
SELECT Name, Department
FROM Employees
GO
说明:
递归 CTE 是 SQL Server 中的常见编程结构。需要注意的重要一点是,默认情况下它们最多嵌套 100 层。如果需要嵌套更深,请使用MAXRECURSION
查询提示
单独的 CTE 无法为您提供完整的输出,您需要使用 UNION
表达式添加原始表中缺失的行。
关于sql - 基于层次结构树将员工关联到部门,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44138708/