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表达式,但我可以找到的所有示例都返回父级的层次结构列表而不是最顶级的父级.
任何人都可以提供任何指针或示例查询
这仍然可以通过递归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)