Вопрос

From EmployeeId 8 I want to get all his parents EmployeeId's which are these EmployeeId's 7,5,3,2,1

CREATE TABLE EmployeeTree(
    EmployeeId int,
        EmployeeName nvarchar(100),
        EmployeeType nvarchar(40),
    EmployeeParentId int 
)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (1, 'Mickey Mouse', 'CEO', NULL)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (2, 'Minnie Mouse', 'President', 1)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (3, 'Donald Duck', 'Division Head', 2)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (4, 'Daffy Duck', 'Division Head', 2)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (5, 'Scrooge McDuck', 'Department Head', 3)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (6, 'Huey McDuck', 'Team Lead', 5)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (7, 'Dewey McDuck', 'Team Lead', 5)

INSERT INTO EmployeeTree (EmployeeId, EmployeeName, EmployeeType, EmployeeParentId)
VALUES (8, 'Louie McDuck', 'Team Member', 7)

With this code I run into recursive problems:

DECLARE @EmployeeId INT
SET @EmployeeId = 8;


WITH x(Id) AS (SELECT @EmployeeId UNION ALL SELECT dbo.EmployeeTree.EmployeeId 
 FROM dbo.EmployeeTree INNER JOIN x ON EmployeeTree.EmployeeId = x.Id )
Select * FROM x JOIN dbo.EmployeeTree as e ON e.EmployeeParentId = x.Id

What do I have to correct in my CTE that I get all parent employee ids for the employeeId 8 ?

Это было полезно?

Решение

You can achieve that using this CTE query. Note that the anchor query also selects from your source table and both employee ID and parent ID are returned in each iteration so that the parent can be joined each time.

DECLARE @EmployeeId INT
SET @EmployeeId = 8;

WITH x AS (
    SELECT EmployeeId, EmployeeParentId
    FROM dbo.EmployeeTree 
    WHERE EmployeeId = @EmployeeId 

    UNION ALL 

    SELECT dbo.EmployeeTree.EmployeeId, dbo.EmployeeTree.EmployeeParentId
    FROM dbo.EmployeeTree
    INNER JOIN x ON EmployeeTree.EmployeeId = x.EmployeeParentId )

Select EmployeeId FROM x
where EmployeeId <> @EmployeeId
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top