SQL Parent Top logging dans la hiérarchie

J'ai une table avec structure:

CompanyID, CompanyName, LinkedCompanyID

de sorte que plusieurs entresockets peuvent être liées dans une hiérarchie

par exemple

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 

Je voudrais une requête pour returnner le parent de premier niveau de chaque entreprise

c'est à dire

 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) 

J'ai jeté un oeil à l'aide d'une expression CTE recusive mais tous les exemples que je peux find returnnent la list hiérarchique du parent vers le bas plutôt que le parent le plus haut.

Quelqu'un peut-il s'il vous plaît fournir des pointeurs ou un exemple de requête

Cela peut encore être réalisé avec un CTE récursif:

 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 

essaye ça:

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