Rekursiv finden alle Ahnen, die das Kind gegeben haben

Angesichts einer Kind-ID muss ich eine Abfrage zurückgeben, die alle Eltern dieses Kindes sowie ihre Eltern enthält, bis ich zum Wurzel-Elternteil komme. Zum Beispiel, da diese data:

ID / Parent ID 1 / 0 2 / 1 3 / 2 4 / 0 5 / 3 

Also, wenn ich in ID 5 gegangen wäre, würde ich gerne eine Abfrage mit den Ergebnissen erhalten:

 ID / Parent ID 1 / 0 2 / 1 3 / 2 

Diese Tabelle funktioniert nicht mit einem hierarchyiden Typ, so dass ich vermute, dass dies mit einem CTE getan werden muss, aber haben keine Ahnung, wie. Wenn es in einer SQL-Abfrage / proc getan werden kann, würde jede Hilfe geschätzt werden.

Vielen Dank

Das ist mehr oder weniger was du willst

 -- CTE to prepare hierarchical result set ;WITH #results AS ( SELECT id, parentid FROM [table] WHERE id = @childId UNION ALL SELECT t.id, t.parentid FROM [table] t INNER JOIN #results r ON r.parentid = t.id ) SELECT * FROM #results; ( -- CTE to prepare hierarchical result set ;WITH #results AS ( SELECT id, parentid FROM [table] WHERE id = @childId UNION ALL SELECT t.id, t.parentid FROM [table] t INNER JOIN #results r ON r.parentid = t.id ) SELECT * FROM #results; 

reference:

  • CTE: Gemeinsamer Tabellenausdruck

Arbeitsbeispiel:

 -- create table with self lookup (parent id) CREATE TABLE #tmp (id INT, parentid INT); -- insert some test data INSERT INTO #tmp (id, parentid) SELECT 1,0 UNION ALL SELECT 2,1 UNION ALL SELECT 3,2 UNION ALL SELECT 4,0 UNION ALL SELECT 5,3; -- prepare the child item to look up DECLARE @childId INT; SET @childId = 5; -- build the CTE WITH #results AS ( SELECT id, parentid FROM #tmp WHERE id = @childId UNION ALL SELECT t.id, t.parentid FROM #tmp t INNER JOIN #results r ON r.parentid = t.id ) -- output the results SELECT * FROM #results WHERE id != @childId ORDER BY id; -- cleanup DROP TABLE #tmp; ( -- create table with self lookup (parent id) CREATE TABLE #tmp (id INT, parentid INT); -- insert some test data INSERT INTO #tmp (id, parentid) SELECT 1,0 UNION ALL SELECT 2,1 UNION ALL SELECT 3,2 UNION ALL SELECT 4,0 UNION ALL SELECT 5,3; -- prepare the child item to look up DECLARE @childId INT; SET @childId = 5; -- build the CTE WITH #results AS ( SELECT id, parentid FROM #tmp WHERE id = @childId UNION ALL SELECT t.id, t.parentid FROM #tmp t INNER JOIN #results r ON r.parentid = t.id ) -- output the results SELECT * FROM #results WHERE id != @childId ORDER BY id; -- cleanup DROP TABLE #tmp; 

Ausgabe:

1 | 0
2 | 1
3 | 2