Ermitteln des übergeordneten Elements der obersten Ebene jeder Tabellenzeile [SQL Server 2008]

Ich habe folgende zwei Tabellen

Tisch Person

Id   Name
   1    A
   2    B
   3    C
   4    D
   5    E

Table RelationHierarchy

ParentId   CHildId
   2         1
   3         2
   4         3

Dies wird eine baumartige Struktur bilden

      D
      |
      C
      |
      B
      |
      A

ParentId und ChildId sind Fremdschlüssel der Spalte Id der Personentabelle

Ich muss SQL schreiben, mit dem ich das übergeordnete i-e-Stammverzeichnis jeder Person auf höchster Ebene abrufen kann.

Der folgende CTE kann dies für jeden tun. Ich habe das in eine Funktion konvertiert und für jede Reihe von Personen ausgeführt. Ich habe ungefähr 3k Zeilen in der Personentabelle und es dauert ungefähr 10 Sekunden, um das zu tun. Kann jemand einen Ansatz vorschlagen, der weniger dauern kann. Das Problem ist die Funktion, die nach CTE 3k-mal ausgeführt wird

DECLARE @childID INT 
SET @childID  = 1 --chield to search

;WITH RCTE AS
(
SELECT *, 1 AS Lvl FROM RelationHierarchy 
WHERE ChildID = @childID

UNION ALL

SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh
INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId
 )
SELECT TOP 1 id, Name
FROM RCTE r
inner JOIN dbo.Person p ON p.id = r.ParentId
ORDER BY lvl DESC

Antworten auf die Frage(3)

Ihre Antwort auf die Frage