层次结构中的SQL Top父记录

fuj*_*jih 3 sql t-sql sql-server common-table-expression

我有一个结构表:

CompanyID,CompanyName,LinkedCompanyID

这样多个公司就可以在层次结构中进行链接

例如

CompanyID, CompanyName, LinkedCompanyID
1          Company A,   NULL
2          Company B,   1
3          Company C,   2
4          Company D,   2
5          Company E,   4
6          Company F,   3
7          Company G,   NULL
Run Code Online (Sandbox Code Playgroud)

我想要一个查询来返回每个公司的顶级父级

CompanyID, CompanyName, ToplevelParentID
1          Company A,   NULL (or 1 I don't mind)
2          Company B,   1
3          Company C,   1
4          Company D,   1
5          Company E,   1
6          Company F,   1
7          Company G,   NULL (or 7 I don't mind)
Run Code Online (Sandbox Code Playgroud)

我已经看过使用重复的CTE表达式,但我可以找到的所有示例都返回父级的层次结构列表而不是最顶级的父级.

任何人都可以提供任何指针或示例查询

Gar*_*thD 6

这仍然可以通过递归CTE实现:

CREATE TABLE #Test (CompanyID INT, CompanyName VARCHAR(20), LinkedCompanyID INT)
INSERT INTO #Test
SELECT  1, 'Company A',   NULL UNION
SELECT  2, 'Company B',   1 UNION
SELECT  3, 'Company C',   2 UNION
SELECT  4, 'Company D',   2 UNION
SELECT  5, 'Company E',   4 UNION
SELECT  6, 'Company F',   3 UNION
SELECT  7, 'Company G',   NULL

;WITH CTE AS
(   SELECT  *, 0 [Level]
    FROM    #Test
    UNION ALL
    SELECT  CTE.CompanyID, CTE.CompanyName, #Test.LinkedCompanyID, Level + 1
    FROM    CTE
            INNER JOIN #Test
                ON CTE.LinkedCompanyID = #Test.CompanyID
    WHERE   #Test.LinkedCompanyID IS NOT NULL
)

SELECT  c.CompanyID, c.CompanyName, c.LinkedCompanyID
FROM    (   SELECT  *, MAX([Level]) OVER (PARTITION BY CompanyName) [MaxLevel]
            FROM    CTE
        ) c
WHERE   MaxLevel = Level

DROP TABLE #Test
Run Code Online (Sandbox Code Playgroud)