Tuesday, January 7, 2020

SQL - CTE Bottom to Top Recursive


Create Table EmployeeTable ([EmployeeId] int, [Name] varchar(10), [ManagerId] int)
INSERT EmployeeTable VALUES (1,'Jane', NULL )       -- StaffHierarchy is as follows:
INSERT EmployeeTable VALUES (2,'Robert',1)          --                    1-Jane
INSERT EmployeeTable VALUES (3,'Tony',2)            --                   /      \
INSERT EmployeeTable VALUES (4,'Albert',3)          --            2-Robert       9-Felix
INSERT EmployeeTable VALUES (5,'David',3)           --            /       \           \
INSERT EmployeeTable VALUES (6,'Heskey',2)          --     3-Tony          6-Heskey    10-Kent
INSERT EmployeeTable VALUES (7,'Marco',6)           --    /      \          /    \
INSERT EmployeeTable VALUES (8,'Judy',6)            -- 4-Albert  5-David 7-Marco  8-Judy
INSERT EmployeeTable VALUES (9,'Felix',1)           --
INSERT EmployeeTable VALUES (10,'Kent',9)


DECLARE @employeeId int = 4;

WITH StaffHierarchy AS
(
    SELECT
            A.[EmployeeId], A.[Name], A.ManagerId, 0 AS [Level]
        FROM EmployeeTable A
        WHERE A.EmployeeId=@employeeId OR (@employeeId IS NULL AND A.ManagerId IS NULL)
    UNION ALL
        SELECT
            B.[EmployeeId], B.[Name], B.ManagerId, C.[Level]+1
        FROM StaffHierarchy C
        INNER JOIN EmployeeTable B ON C.ManagerId=B.[EmployeeId]
)
SELECT EmployeeId,
       [Name],
       ManagerId,
       [Level]
FROM StaffHierarchy
ORDER BY ManagerId asc;

No comments:

Post a Comment