SQL Top родительская запись в иерархии - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть таблица со структурой:

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

Я бы хотел, чтобы запрос возвращал родительский уровень каждой компании

, то есть

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)

Я рассмотрел использование рекурсивного выражения CTE, но во всех примерах яможно найти возврат иерархического списка от родительского вниз, а не самого верхнего родителя.

Может кто-нибудь, пожалуйста, предоставить любые указатели или пример запроса

Ответы [ 2 ]

6 голосов
/ 09 февраля 2012

Этого можно достичь с помощью рекурсивного 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
0 голосов
/ 09 февраля 2012

попробуйте это:

Select * , (select CompanyName from  Company C_aux where C_Main.LinkedCompanyID = C_aux.CompanyID) as ToplevelParentID
from Company C_Main
...