none
Abfrage Pfad von rekursiven Daten RRS feed

  • 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              Folder5

    Ich 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

    Mittwoch, 23. März 2011 13:55

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
    Mittwoch, 23. März 2011 19:05

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
    Mittwoch, 23. März 2011 13:59
  • Hallo Olaf,

    danke für die Antwort. Ich kenn das mit der rekursiven CTE Abfrage aber irgendwie bring ich das nicht hin.

    Kann mir da jemand ev. noch weitere Details geben.

    Vielen herzlichen Dank.

    Gruss Ivan

    Mittwoch, 23. März 2011 16:08
  • 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
    Mittwoch, 23. März 2011 19:05
  • Hallo Olaf,

    vielen herzlichen Dank. Das ist super.

    Gruss Ivan

    Freitag, 25. März 2011 19:35