none
SQL Query denkanstoß RRS feed

  • Frage

  • Hallo,

    Ich brauche mal einen Denkanstoß zu einer SQL-Query.

    Ich habe eine Tabelle mit 3 Spalten, eine ID, eine Spalte für einen Wert und eine Spalte für eine Referenz-ID.
    Die Spalte der Referenz-ID verweißt auf die Spalte ID.

    Wenn ich nun einen neuen Eintrag vornehme, bekommt dieser eine neue ID und der alte Eintag, der sich auf den neuen Eintrag bezieht, als Referenz-ID, die neue ID.

    Wie kann ich nun die Tabelle abfragen, daß ich so eine art Verlauf bekomme, also alle Einträge die sich auf eine ID beziehen oder bei dieser ID starten?

    Donnerstag, 28. Juni 2012 14:55

Antworten

  • Hallo,

    Ab SQL Server 2005 kannst Du eine rekursive CTE = Common Table Expression nutzen.

    Das Beispiel stellt eine lineare Liste dar und die Abfrage liefert alle Datensätze in der Kette ab z.B. ID = 3:

    DECLARE @table TABLE (id int, Wert varchar(20),refid int);
    
    INSERT INTO @table VALUES (1, 'h1', NULL);
    INSERT INTO @table VALUES (2, 'h2', 1);
    INSERT INTO @table VALUES (3, 'h3', 2);
    INSERT INTO @table VALUES (4, 'h4', 3);
    INSERT INTO @table VALUES (5, 'h5', 4);
    
    ;WITH cte AS
        (SELECT *
         FROM @table
         WHERE id = 3
         UNION ALL
         SELECT T2.*
         FROM cte AS T1
              INNER JOIN
              @table AS T2
                  ON T1.id = T2.refid
              )
    SELECT *
    FROM cte;


    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

    Donnerstag, 28. Juni 2012 16:09

Alle Antworten

  • Hi,

    wo willst Du den Verlauf haben? Direkt in SQL? Falls ja, welche SQL Server Version setzt Du ein?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 28. Juni 2012 15:39
    Moderator
  • Hallo,

    Ab SQL Server 2005 kannst Du eine rekursive CTE = Common Table Expression nutzen.

    Das Beispiel stellt eine lineare Liste dar und die Abfrage liefert alle Datensätze in der Kette ab z.B. ID = 3:

    DECLARE @table TABLE (id int, Wert varchar(20),refid int);
    
    INSERT INTO @table VALUES (1, 'h1', NULL);
    INSERT INTO @table VALUES (2, 'h2', 1);
    INSERT INTO @table VALUES (3, 'h3', 2);
    INSERT INTO @table VALUES (4, 'h4', 3);
    INSERT INTO @table VALUES (5, 'h5', 4);
    
    ;WITH cte AS
        (SELECT *
         FROM @table
         WHERE id = 3
         UNION ALL
         SELECT T2.*
         FROM cte AS T1
              INNER JOIN
              @table AS T2
                  ON T1.id = T2.refid
              )
    SELECT *
    FROM cte;


    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

    Donnerstag, 28. Juni 2012 16:09
  • Den Verlauf möchte direkt in SQL haben und es ist MS-SQL 2008 R2.
    Donnerstag, 28. Juni 2012 18:37
  • Oh, ich glaube, daß ist es schon. So ganz verstehe ich es aber noch nicht. Ich werde es mir morgen zu gemüte führen und bestimmt noch ein paar fragen haben...

    Danke aber erstmal :-) 

    Donnerstag, 28. Juni 2012 18:42