EMZETT.
Login

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, ltree in PostgreSQL.

Siehe auch: SQL-Fensterfunktionen