Benutzer mit den meisten Antworten
SQL Query denkanstoß

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?
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- Als Antwort vorgeschlagen Christoph Muthmann Freitag, 29. Juni 2012 10:06
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 1. August 2012 09:07
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 -
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- Als Antwort vorgeschlagen Christoph Muthmann Freitag, 29. Juni 2012 10:06
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 1. August 2012 09:07