Eine Zahlenfolge
Teil des Abschnitts Über die Grundlagen hinaus der SQL-Journey von Coddy — Lektion 20 von 27.
Sie haben das Schlüsselwort WITH in Grundlagen kennengelernt, um eine Unterabfrage zu benennen, die auch als CTE (Common Table Expression) bezeichnet wird. Eine rekursive CTE geht noch einen Schritt weiter: Sie ermöglicht es der Unterabfrage, auf sich selbst zu verweisen und so ein Ergebnis Zeile für Zeile aufzubauen.
Die einfachste Version erzeugt eine Zahlenfolge ohne eine zugrunde liegende Tabelle. Die Form ist immer dieselbe:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- Anker: die Startzeile
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- rekursiv: Erzeuge das Nächste aus dem Letzten
)
SELECT n FROM counterLies es so: Beginne mit n = 1, füge dann fortlaufend Zeilen hinzu, wobei jedes n das vorherige n + 1 ist, und stoppe, wenn WHERE nicht mehr übereinstimmt. Das Ergebnis ist 1, 2, 3, 4, 5.
Die beiden Teile des Bodys werden durch UNION ALL verbunden. Der erste ist der Anchor (Anker): die Seed-Zeilen. Der zweite ist der rekursive Schritt: er fragt die CTE selbst ab.
Aufgabe
EinfachSchreibe eine rekursive CTE namens powers mit zwei Spalten:
i: der Iterationsindex, beginnend bei1p:2hochi(2,4,8, …)
Stoppe, sobald p den Wert 1000 übersteigen würde. Gib beide Spalten zurück, sortiert nach i aufsteigend.
Spickzettel
Ein rekursives CTE ermöglicht es einer Unterabfrage, auf sich selbst zu verweisen und Ergebnisse Zeile für Zeile aufzubauen:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- Anker: Startzeile
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- rekursiver Schritt
)
SELECT n FROM counter- Anker: die Startzeile(n) (erstes
SELECT) - Rekursiver Schritt: fragt das CTE selbst ab, um die nächste Zeile zu erzeugen
- Stoppt, wenn die
WHERE-Bedingung nicht mehr zutrifft - Die beiden Teile werden mit
UNION ALLverbunden
Probier es selbst
WITH RECURSIVE powers(i, p) AS (
-- Anker: i=1, p=2
-- rekursiv: i+1, p*2, bis p 1000 erreicht
)
SELECT i, p FROM powers ORDER BY i
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.