如何从底部 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.
我正在尝试创建反向层次结构路径。
这是给下级经理的路径
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.