Ich war heute die CTE docs studieren und unten um mit einem Beispiel zu spielen (etwas aus dem Beispiel in dem Dokument geändert):Wie funktioniert der rekursive CTE mit Beispiel im Dokument?
WITH RECURSIVE t(n) AS (
VALUES (1), (2)
UNION ALL
(
SELECT n + 1
FROM t
WHERE n < 100
)
)
SELECT * FROM t;
Dieses Stück Code Ausgänge
n
-----
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
11
11
12
12
13
13
...
was in Ordnung ist durch selbst. Doch in dem doc, geht die Erklärung wie die folgenden (https://www.postgresql.org/docs/9.1/static/queries-with.html):
- den nicht-rekursive Ausdruck auswerten. Für
UNION
(aber nicht), doppelte Zeilen verwerfen. Schließen Sie alle verbleibenden Zeilen in das Ergebnis der rekursiven Abfrage von ein und platzieren Sie sie auch in einer temporären Tabelle.Solange der Arbeitstisch nicht leer ist, wiederholen Sie diese Schritte:
- Bewerten Sie die rekursive Begriff, den aktuellen Inhalt des dem Arbeitstisch für die rekursive Selbstreferenz ersetzen. Für
UNION
(aber nicht), verwerfen Sie doppelte Zeilen und Zeilen, die eine vorherige Ergebniszeile duplizieren. Schließen Sie alle verbleibenden Zeilen in das Ergebnis der rekursiven Abfrage ein und platzieren Sie sie auch in einer temporären Tabelle zwischen .- Ersetzen Sie den Inhalt der Arbeitstabelle durch den Inhalt der Zwischentabelle und leeren Sie dann die Zwischentabelle.
Meine Interpretation der Erklärungen ist wie folgt:
Zunächst haben wir (1), (2)
in den Arbeitstisch legen. Dann nehmen wir im rekursiven Schritt die Arbeitstabelle, die derzeit (1), (2)
, die Ergebnisse des rekursiven Schritts hat, die (2), (3)
zurückgibt, und platzieren Sie dann die Ergebnisse in Zwischentabelle.
So nach dem ersten rekursiven Aufruf haben wir (1), (2)
in Tabelle arbeiten und (1), (2), (2), (3)
in Zwischentabelle.
Dann ersetzen wir die Werte von Tabelle mit den Werten der Zwischentabelle arbeiten und dann die Zwischentisch leer aus. So jetzt Arbeitstisch hat (1), (2), (2), (3)
und Zwischentisch ist leer.
Jetzt nächsten rekursiven Aufruf, nehmen wir die Arbeitstisch die (1), (2), (2), (3)
, recurse darauf enthält, die (2), (3), (3), (4)
, und hängen Sie ihn an den Arbeitstisch ergibt.Also sollte der Arbeitstisch nun (1), (2), (2), (3), (2), (3), (3), (4)
haben. Die Ergebnisse beginnen jedoch mit (1), (2), (2), (3), (3), (3), (4), (4)
usw.
Kann mir jemand wissen, wo ich in meiner Argumentation falsch ging?
http://stackoverflow.com/q/37880628/330315 und http://stackoverflow.com/questions/30015842 –