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