Wie läuft ein rekursiver CTE Zeile für Zeile ab?
Rekursive CTEs bestehen wie endlose UNION ALLs aus einem Basisfall und einem Vielfachen rekursive Aufrufe. Bedenken Sie Folgendes:
WITH rows AS ( SELECT * FROM mytable WHERE anchor_condition ), rows2 AS ( SELECT * FROM set_operation(mytable, rows) ), rows3 AS ( SELECT * FROM set_operation(mytable, rows2) ), … SELECT * FROM rows UNION ALL SELECT * FROM rows2 UNION ALL SELECT * FROM rows3 UNION ALL …
Im bereitgestellten Beispiel:
WITH abcd1 AS ( SELECT * FROM @tbl t WHERE ParentId IS NULL ), abcd2 AS ( SELECT t.* FROM abcd1 JOIN @tbl t ON t.ParentID = abcd1.id ), abcd3 AS ( SELECT t.* FROM abcd2 JOIN @tbl t ON t.ParentID = abcd2.id ), abcd4 AS ( SELECT t.* FROM abcd3 JOIN @tbl t ON t.ParentID = abcd3.id ), abcd5 AS ( SELECT t.* FROM abcd4 JOIN @tbl t ON t.ParentID = abcd4.id ), abcd6 AS ( SELECT t.* FROM abcd5 JOIN @tbl t ON t.ParentID = abcd5.id ) SELECT * FROM abcd1 UNION ALL SELECT * FROM abcd2 UNION ALL SELECT * FROM abcd3 UNION ALL SELECT * FROM abcd4 UNION ALL SELECT * FROM abcd5 UNION ALL SELECT * FROM abcd6
Jede Ankeriteration führt zu einem neuen rekursiven Aufruf, wodurch eine Reihe verschachtelter Ebenen erstellt wird. Der Anker wird einmal aufgerufen und dient als Ausgangspunkt. Nachfolgende Iterationen verwenden die Ergebnisse früherer Aufrufe, um das rekursive Mitglied zu füllen.
Da abcd6 keine Ergebnisse zurückgibt, impliziert dies eine Stoppbedingung. Theoretisch können rekursive CTEs unendlich sein, aber SQL Server erzwingt eine Begrenzung, um unendliche Recordsets zu verhindern.
Weitere Einblicke finden Sie im folgenden Artikel:
Das obige ist der detaillierte Inhalt vonWie wird ein rekursiver CTE Schritt für Schritt ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!