Menu
Coddy logo textTech

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 counter

Lies 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.

challenge icon

Aufgabe

Einfach

Schreibe eine rekursive CTE namens powers mit zwei Spalten:

  • i: der Iterationsindex, beginnend bei 1
  • p: 2 hoch i (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 ALL verbunden

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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Über die Grundlagen hinaus