sql-server - SQL Server parent child (parent see all everything)?

标签 sql-server tsql parent-child hierarchy

这是我的 table :

EmployeeID  Employee    ManagerID
---------------------------------
    1       Anna           5
    2       John           4
    3       Steve          4
    4       Lisa           1
    5       Adam          NULL
    6       Per            1

我通过这样的自连接获得父子关系没有问题:

SELECT 
    E.EmployeeID,
    E.Employee AS Employee,
    E.ManagerID,
    M.Employee AS Manager
FROM 
    Employee AS E
LEFT JOIN 
    Employee AS M ON E.ManagerID = M.EmployeeID

EmployeeID  Employee    ManagerID   Manager
1   Anna    5   Adam
2   John    4   Lisa
3   Steve   4   Lisa
4   Lisa    1   Anna
5   Adam    NULL NULL
6   Per     1    Anna

但是,我将如何确保父级看到整个层次结构级别?

我希望表格看起来像这样:

EmployeeID  Manager Employee    EmployeeID  
5   Adam    Anna    1
5   Adam    Per     6
5   Adam    Lisa    4
5   Adam    John    2
5   Adam    Steve   3
1   Anna    Per     6
1   Anna    Lisa    4
1   Anna    John    2
1   Anna    Steve   3
4   Lisa    John    2
4   Lisa    Steve   3

注意:在这个例子中,我只有 3 层马槽,但可以有更多

最佳答案

你可以试试这个:

DECLARE @DataSource TABLE
(
    [EmployeeID] TINYINT
   ,[Employee] VARCHAR(12)
   ,[ManagerID] TINYINT 
);

INSERT INTO @DataSource ([EmployeeID], [Employee], [ManagerID])
VALUES (1, 'Anna', 5)
      ,(2, 'John', 4)
      ,(3, 'Steve', 4)
      ,(4, 'Lisa', 1)
      ,(5, 'Adam', NULL)
      ,(6, 'Per',  1);

WITH DataSource AS 
(
    SELECT DISTINCT DS1.*
                   ,0 AS [Level]
                   ,DS1.[EmployeeID] AS Parent
    FROM @DataSource DS1
    INNER JOIN @DataSource DS2
        ON DS1.[EmployeeID] = DS2.[ManagerID]
    UNION ALL
    SELECT DS2.*
          ,DS1.[Level] + 1
          ,DS1.Parent
    FROM DataSource DS1
    INNER JOIN @DataSource DS2
        ON DS1.[EmployeeID] = DS2.[ManagerID]
)
SELECT DS1.[EmployeeID] 
      ,DS1.[Employee] AS [Manager]
      ,DS.[EmployeeID]
      ,DS.[Employee]
FROM DataSource DS
INNER JOIN @DataSource DS1
    ON DS.[Parent] = DS1.[EmployeeID]
WHERE DS.[Level] <> 0
ORDER BY DS.[Parent] DESC;

enter image description here

我们正在使用递归 CTE,如果您是第一次看到这种语法,它可能看起来有点困惑和复杂,但它并没有什么特别之处。

何时使用递归 CTE 运行一些性能测试,以确保它是解决问题的正确技术。

关于sql-server - SQL Server parent child (parent see all everything)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258805/

相关文章:

sql - 使用 DATEADD 后如何转换值

sql - 如何删除具有多个值的行并仅选择 1 行

c# - 尝试将 sql 数据导入 visual studio web 表单数据库

sql - 递归 CTE 查询循环直到满足条件

javascript - 从主窗口滚动子级(AG网格)

sql - 使用记录 ID 列表作为输入更新 SQL 服务器中的 400 万条记录

sql - 这个MySQL语句: DECLARE @ID INT有什么问题

sql-server - 基于日期的多组按 T-SQL 查询

c# - 使用父级从组件 Blazor 调用方法

ios - 无法在容器 View 中添加 IBAction 按钮