【问题标题】:Get all parent's Id including the root's Id with CTE使用 CTE 获取所有父级的 Id,包括根的 Id
【发布时间】:2014-04-20 23:25:54
【问题描述】:

从 EmployeeId 8 我想得到他所有的父母 EmployeeId,这些是 EmployeeId 的 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)

使用这段代码我遇到了递归问题:

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

我必须在我的 CTE 中更正什么,才能获得employeeId 8 的所有父员工ID?

【问题讨论】:

    标签: sql common-table-expression


    【解决方案1】:

    您可以使用此 CTE 查询来实现。请注意,锚查询还会从您的源表中进行选择,并且在每次迭代中都会返回员工 ID 和父 ID,以便每次都可以连接父级。

    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
    

    【讨论】:

    • Error: Must declare the scalar variable "@EmployeeId"。请see this.
    • @RagingBull 它不适用于 SQL Fiddle 中的变量,但它适用于真正的 SQL Server。一定是 SQL Fiddle 的一些限制。
    • @RagingBull 用直接使用的值检查这个小提琴sqlfiddle.com/#!3/2a1946/7
    • 好的,我的朋友。我只是想和OP一起学习。没有冒犯的意思。感谢您澄清 (+1)。
    • 无意冒犯 :) 看到 SQL Fiddle 不能处理这个问题,我自己也很惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2014-08-06
    相关资源
    最近更新 更多