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 dir, temporäre benannte Ergebnismengen zu definieren, auf die du in einer Abfrage verweisen kannst. 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
Datensatz in DbGate Lite erkunden

Grundlegende 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 employees-Tabelle, um die Namen anzuzeigen.

Mehrere CTEs

Du kannst mehrere CTEs definieren, getrennt durch Kommata. 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 du hierarchische oder baumartige Daten durchlaufen kannst. 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)

Finde alle Mitarbeiter unter Alice (der CEO):

Beispiel: Befehlskette (Manager-Hierarchie finden)

Finde 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, wie Stored Procedures oder Rekursion in der Anwendung.

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

  • Vereinfachung komplexer Abfragen – Eine große Abfrage 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 erstellen
  • 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 jedoch leicht unterscheiden)

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