Was ist cte?

CTE (Common Table Expression)

Eine Common Table Expression (CTE), auch bekannt als "WITH-Abfrage", ist ein benannter temporärer Resultatsatz, der innerhalb einer einzelnen SELECT, INSERT, UPDATE oder DELETE Anweisung definiert wird. CTEs sind in SQL eine mächtige Methode, um komplexe Abfragen zu strukturieren und lesbarer zu machen. Sie ähneln temporären Tabellen, existieren aber nur während der Ausführung der Abfrage, in der sie definiert sind.

Wichtige Aspekte:

  • Syntax: Eine CTE wird mit dem Schlüsselwort WITH eingeleitet, gefolgt vom Namen der CTE, einer optionalen Spaltenliste in Klammern, dem Schlüsselwort AS und der die CTE definierenden SELECT-Anweisung.

  • Geltungsbereich: Der Geltungsbereich einer CTE ist auf die einzelne Abfrage beschränkt, in der sie definiert ist. Sie kann innerhalb dieser Abfrage mehrfach verwendet werden, existiert aber danach nicht mehr.

  • Rekursive CTEs: CTEs können rekursiv sein, d.h. sie können sich selbst referenzieren. Dies ist nützlich für die Abfrage hierarchischer Daten wie Organisationsstrukturen oder Stammbäume. Siehe Rekursive%20Abfragen für weitere Informationen.

  • Mehrere CTEs: Es können mehrere CTEs in einer einzigen Abfrage definiert werden, indem sie durch Kommas getrennt werden.

  • Vorteile:

    • Verbesserte Lesbarkeit: Komplexe Abfragen werden in kleinere, logische Einheiten zerlegt, was die Lesbarkeit und Wartbarkeit erhöht.
    • Wiederverwendung von Code: Die Ergebnisse einer CTE können mehrfach in der Abfrage verwendet werden, wodurch Code-Duplizierung vermieden wird.
    • Rekursive Abfragen: Ermöglichen die Durchführung von rekursiven Abfragen.
    • Logische Strukturierung: CTEs helfen, die logische Struktur einer Abfrage klarer darzustellen.
  • Anwendungsfälle:

    • Abfrage hierarchischer Daten.
    • Ersetzen von Sub-Queries zur Verbesserung der Lesbarkeit.
    • Vereinfachung komplexer Berechnungen.
    • Partitionierung von Daten für Reporting-Zwecke.
  • Performance: In manchen Fällen können CTEs die Performance von Abfragen verbessern, da der Datenbank-Optimierer die CTE separat betrachten und optimieren kann. Dies ist aber nicht immer der Fall, und es ist wichtig, die Performance mit und ohne CTE zu testen.

  • Beispiel (PostgreSQL):

WITH customer_total AS (
    SELECT
        customer_id,
        SUM(amount) AS total_spent
    FROM
        payments
    GROUP BY
        customer_id
)
SELECT
    c.customer_id,
    c.name,
    ct.total_spent
FROM
    customers c
JOIN
    customer_total ct ON c.customer_id = ct.customer_id
WHERE
    ct.total_spent > 100;

Dieses Beispiel definiert eine CTE namens customer_total, die die Gesamtausgaben jedes Kunden berechnet. Diese CTE wird dann in der Hauptabfrage verwendet, um die Kundennamen und die Gesamtausgaben für Kunden anzuzeigen, die mehr als 100 ausgegeben haben. Siehe auch SQL für eine allgemeine Einführung.