如何从底部 SQL 服务器创建层次结构路径

How to make hierarchy path from bottom SQL Server

我正在尝试创建反向层次结构路径。

这是给下级经理的路径

WITH CTE_Path AS 
(
    SELECT 
        P1.EmployeeID, P1.ManagerID, 
        CAST(FirstName + LastName AS NVARCHAR(MAX)) AS PathHierarchy, 
        1 AS level
    FROM 
        EmployeesManagers AS P1
    WHERE 
        ManagerID IS NULL
 
    UNION ALL
    
    SELECT 
        P2.EmployeeID, P2.ManagerID, 
        CONCAT(CAST(C.PathHierarchy AS NVARCHAR(MAX)),  N' > ', 
        CAST(P2.FirstName+LastName AS NVARCHAR(MAX))), level + 1 
    FROM 
        EmployeesManagers AS P2
    JOIN 
        CTE_Path AS C ON C.EmployeeID = P2.ManagerID 
)
SELECT PathHierarchy
FROM CTE_Path

这个的数据

CREATE TABLE dbo.EmployeesManagers
(
    EmployeeID int NOT NULL PRIMARY KEY,
    FirstName varchar(50) NOT NULL,
    LastName varchar(50) NOT NULL,
    ManagerID int NULL
)
GO

INSERT INTO EmployeesManagers VALUES (101, 'Ken', 'Sánchez', NULL)
INSERT INTO EmployeesManagers VALUES (102, 'Terri', 'Duffy', 101)
INSERT INTO EmployeesManagers VALUES (103, 'Roberto', 'Tamburello', 101)
INSERT INTO EmployeesManagers VALUES (104, 'Rob', 'Walters', 102)
INSERT INTO EmployeesManagers VALUES (105, 'Gail', 'Erickson', 102)
INSERT INTO EmployeesManagers VALUES (106, 'Jossef', 'Goldberg', 103)
INSERT INTO EmployeesManagers VALUES (107, 'Dylan', 'Miller', 103)
INSERT INTO EmployeesManagers VALUES (108, 'Diane', 'Margheim', 105)
INSERT INTO EmployeesManagers VALUES (109, 'Gigi', 'Matthew', 105)
INSERT INTO EmployeesManagers VALUES (110, 'Michael', 'Raheem', 106)

我需要 subordinate-manager-manager1 - ...

这里要改什么?锚点还是递归部分?

是否可以创建可以提供参数 EmployeeID 的函数,它将 return 路径 employee-manager-manager1-ceoOfCompany?

您可以从员工不是经理的地方开始反转逻辑,然后在递归子查询的第二部分调整连接:

WITH CTE AS (
      SELECT P1.EmployeeID, P1.ManagerID, CAST(FirstName+LastName AS NVARCHAR(MAX)) AS PathHierarchy, 1 as level
      FROM EmployeesManagers AS P1
      WHERE NOT EXISTS (SELECT 1 FROM EmployeesManagers em2 WHERE EM2.ManagerID = p1.EmployeeId)
      UNION ALL
      SELECT P2.EmployeeID, P2.ManagerID, CONCAT(CAST(C.PathHierarchy AS NVARCHAR(MAX)),  N' > ', CAST(P2.FirstName+LastName AS NVARCHAR(MAX))), level+1 
      FROM CTE c JOIN
           EmployeesManagers P2
           ON P2.EmployeeID = C.ManagerID 
    )
SELECT PathHierarchy
FROM CTE;

Here 是一个 db<>fiddle.