SQL WITH-Klausel: Common Table Expressions (CTE) und rekursive Abfragen

Published: 2026-02-04

Die WITH-Klausel (auch Common Table Expression oder CTE genannt) ermöglicht es Ihnen, temporäre benannte Ergebnismengen zu definieren, auf die Sie in einer Abfrage verweisen können. Das macht komplexe Abfragen besser lesbar und wiederverwendbar. Sie ist in den meisten modernen SQL-Datenbanken verfügbar, darunter SQLite, PostgreSQL, MySQL 8.0+, SQL Server und Oracle.

Beispieldaten

Wir verwenden in allen Beispielen zwei Tabellen:

employees-Tabelle:

id name manager_id salary
1 Alice NULL 120000
2 Bob 1 80000
3 Carol 1 85000
4 Dave 2 60000
5 Eve 2 62000
6 Frank 3 58000

sales-Tabelle:

id employee_id amount month
1 2 5000 January
2 2 6000 February
3 3 7000 January
4 3 8000 February
5 4 3000 January
6 5 4000 January
7 6 2500 February

Einfache WITH-Klausel (nicht rekursiv)

Eine WITH-Klausel definiert eine oder mehrere benannte temporäre Tabellen, die nur für die Dauer der Abfrage existieren.

Beispiel: Gesamtumsatz pro Mitarbeiter

Die CTE employee_sales berechnet den Gesamtumsatz pro Mitarbeiter, anschließend verbinden wir sie mit der Tabelle employees, um die Namen anzuzeigen.

Mehrere CTEs

Sie können mehrere CTEs definieren, getrennt durch Kommas. Spätere CTEs können auf frühere verweisen.

Beispiel: Verkaufsanalyse mit mehreren Kennzahlen

WITH RECURSIVE: Hierarchien durchlaufen

WITH RECURSIVE erlaubt es einer CTE, auf sich selbst zu verweisen, sodass Sie hierarchische oder baumartige Daten durchlaufen können. Das ist nützlich für Organigramme, Kategoriehierarchien oder beliebige Eltern-Kind-Beziehungen.

Eine rekursive CTE hat zwei Teile:

  1. Basisabfrage: Die anfängliche Menge von Zeilen
  2. Rekursive Abfrage: Verweist auf die CTE selbst, um verwandte Zeilen zu finden

Beispiel: Organigramm (alle Mitarbeiter unter einem Manager)

Finden Sie alle Mitarbeiter unter Alice (der CEO):

Beispiel: Befehlskette (Manager-Hierarchie finden)

Finden Sie die vollständige Befehlskette für Dave (der Bob unterstellt ist, der wiederum Alice unterstellt ist):

WITH RECURSIVE-Syntax in verschiedenen Datenbanken

WITH RECURSIVE wird unterstützt in:

  • SQLite — 3.8.3+ (2013)
  • PostgreSQL — 8.4+ (2009)
  • SQL Server — 2005+ (als „Recursive CTE“ bezeichnet)
  • Oracle — 11g+ (als „Recursive Subquery Factoring“ bezeichnet)
  • MySQL — 8.0+ (2018)

Hinweis: Ältere MySQL-Versionen und einige andere Datenbanken unterstützen keine rekursiven CTEs – dort sind eventuell andere Ansätze nötig, etwa Stored Procedures oder Rekursion auf Anwendungsebene.

Häufige Anwendungsfälle für WITH-Klauseln

  • Vereinfachung komplexer Abfragen – Große Abfragen in logische Schritte aufteilen
  • Wiederverwendung von Unterabfragen – Eine Berechnung einmal definieren und mehrfach verwenden
  • Hierarchisches Traversieren – Bäume durchlaufen (Organigramme, Kategorien, Kommentare)
  • Sequenzen erzeugen – Zahlenbereiche oder Datumsbereiche generieren
  • Schrittweise Aggregationen – Ergebnisse in mehreren Stufen aufbauen

Zusammenfassung

  • WITH (CTE) erstellt eine benannte temporäre Ergebnismenge zur Verwendung in einer Abfrage
  • Mehrere CTEs können miteinander verkettet werden
  • WITH RECURSIVE erlaubt es einer CTE, sich selbst für hierarchische Abfragen zu referenzieren
  • Rekursive CTEs benötigen einen Basisfall und einen rekursiven Fall, getrennt durch UNION ALL
  • Wird in allen modernen SQL-Datenbanken unterstützt (die Syntax kann sich leicht unterscheiden)

Probieren Sie aus, die obigen Beispiele zu verändern, um verschiedene Hierarchien oder Berechnungen zu erkunden!