sql - 基于层次结构树将员工关联到部门

标签 sql sql-server

我试图弄清楚如何构建一个查询来根据组织层次结构对部门关联进行排序。因此,如果 John 负责销售,向 Jane 汇报,而 Jane 则向 Mike 汇报。 Jane 应继承 salesMike 也应继承销售部门。

示例表:

+-------+------------+------------+
| Name  | Department | Supervisor |
+-------+------------+------------+
| John  | Sales      | Jane       |
| Jane  | Supervisor | Mike       |
| Fred  | Supervisor | Mike       |
| Alex  | Retail     | Fred       |
| Mike  | Manager    | ---        |
| Chris | Sales      | Jane       |
| Dan   | Retail     | Fred       |
+-------+------------+------------+

树会是什么样子:

enter image description here

预期输出:

+-------+------------+
| 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/

相关文章:

java - 为什么我的长整数会稍微改变一点?

php词过滤功能?

mysql - SQL:按不变状态间隔长度分组

mysql - 如何在SQL中填充7天访问90天访问列

c# - 为什么 Kendo 的 ToDataSourceResult 为一个查询创建两个 ADO.Net 调用

c# - C#中存储过程的返回值返回错误

php mysql 共享数据到mysql

sql - 数据库 [dbName] 不可访问。 (对象资源管理器)

sql - MSSQL中CTE、临时表和表变量的区别

sql - sql server如何使用管道字符进行排序