Rekursive CTEs: Bäume und Hierarchien in SQL
Kurz: Eine rekursive CTE („Common Table Expression”) ruft sich in SQL selbst auf und durchläuft so Bäume und Hierarchien, etwa Kategorien, Organigramme oder Antworten in Forenfäden.
Genauer: Normale Abfragen kennen eine feste Zahl von Verknüpfungen. Hierarchien haben eine unbekannte Tiefe. Die rekursive CTE wiederholt einen Schritt, bis nichts Neues mehr hinzukommt.
Im Detail
- Aufbau: Ein Startteil (Anker),
UNION ALL, und ein rekursiver Teil, der auf die CTE selbst verweist.
WITH RECURSIVE baum AS (
SELECT id, name, parent_id, 0 AS tiefe
FROM kategorie WHERE parent_id IS NULL
UNION ALL
SELECT k.id, k.name, k.parent_id, b.tiefe + 1
FROM kategorie k JOIN baum b ON k.parent_id = b.id
)
SELECT * FROM baum ORDER BY tiefe;- Ablauf: Der Anker liefert die Wurzeln, der rekursive Teil holt jeweils die Kinder der zuletzt gefundenen Zeilen.
- Schutz vor Endlosschleifen: Bei Zyklen (A → B → A) muss man besuchte Knoten merken oder die Tiefe begrenzen.
- Weitere Nutzung: Zahlenreihen erzeugen, Wegsuche in Graphen, Stücklisten auflösen.
- Alternativen: Spalte mit dem Pfad („Materialized Path”), verschachtelte Mengen,
ltreein PostgreSQL.
Siehe auch: SQL-Fensterfunktionen