Benutzer mit den meisten Antworten
Abfrage Pfad von rekursiven Daten

Frage
-
Hallo,
ich habe folgende Tabelle:
Table1
ID (uniqueidentifier)
ParentID (uniqueidentifier)
Title (nvarchar(50))Die Tabelle ist von ID nach ParentID 1..n verknüpft.
Inhalt der Tabelle1 (Damit besser ersichtlich verwende ich hier zum zeigen int-Werte für ID und ParentID anstelle uniqueidentifier)
ID ParentID Title
1 NULL Folder1
2 1 Folder2
3 1 Folder3
4 2 Folder4
5 4 Folder5Ich benötige nun von der ID 5 der ganze Pfad nach oben bis ParentID = NULL. Müsste also z.B. so aussehen Folder1\\Folder2\\Folder4\\.
Kann man sowas mit einer SQL-Abfrage bewerkstelligen?
Vielen Dank für eure Hilfe.
Gruss Ivan
Antworten
-
Hallo Ivan,
man muss gelegentlich auch zum Nach- & Mitdenken motivieren, deswegen nicht unbedingt immer gleich eine komplette Lösung; es soll ja auch lehrreich sein. So geht es; Deine Demo Daten liefern aber ein etwas abweichende Ergebnis als gewünscht:
CREATE TABLE #hier
( ID int
,ParentID int
,Title nvarchar(200));
INSERT INTO #hier VALUES (1, NULL, 'Folder1');
INSERT INTO #hier VALUES (2, 1, 'Folder2');
INSERT INTO #hier VALUES (3, 1, 'Folder3');
INSERT INTO #hier VALUES (4, 2, 'Folder4');
INSERT INTO #hier VALUES (5, 4, 'Folder5');
GO
;WITH cte AS
( SELECT Par.ID, Par.ParentID, CONVERT(nvarchar(4000), Par.Title) AS Title
FROM #hier AS Par
WHERE PAr.ParentID IS NULL
UNION ALL
SELECT Chl.ID, Chl.ParentID, Par.Title + N'\' + Chl.Title AS Title
FROM cte AS Par
INNER JOIN
#hier AS Chl
ON Par.ID = Chl.ParentID
)
SELECT *
FROM cte
WHERE ID = 5;
GO
DROP TABLE #hier;
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog- Als Antwort markiert Ivan hui Freitag, 25. März 2011 19:35
Alle Antworten
-
Hallo Ivan,
das sollte mit einer rekursiven CTE Abfrage zu lösen sein, das Beispiel mit Manager <=> Employee ist ja analog.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Hallo Ivan,
man muss gelegentlich auch zum Nach- & Mitdenken motivieren, deswegen nicht unbedingt immer gleich eine komplette Lösung; es soll ja auch lehrreich sein. So geht es; Deine Demo Daten liefern aber ein etwas abweichende Ergebnis als gewünscht:
CREATE TABLE #hier
( ID int
,ParentID int
,Title nvarchar(200));
INSERT INTO #hier VALUES (1, NULL, 'Folder1');
INSERT INTO #hier VALUES (2, 1, 'Folder2');
INSERT INTO #hier VALUES (3, 1, 'Folder3');
INSERT INTO #hier VALUES (4, 2, 'Folder4');
INSERT INTO #hier VALUES (5, 4, 'Folder5');
GO
;WITH cte AS
( SELECT Par.ID, Par.ParentID, CONVERT(nvarchar(4000), Par.Title) AS Title
FROM #hier AS Par
WHERE PAr.ParentID IS NULL
UNION ALL
SELECT Chl.ID, Chl.ParentID, Par.Title + N'\' + Chl.Title AS Title
FROM cte AS Par
INNER JOIN
#hier AS Chl
ON Par.ID = Chl.ParentID
)
SELECT *
FROM cte
WHERE ID = 5;
GO
DROP TABLE #hier;
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog- Als Antwort markiert Ivan hui Freitag, 25. März 2011 19:35