Was sind Common Table Expressions (CTEs)?
Ein Common Table Expression (CTE) ist die Ergebnismenge einer Abfrage, die vorübergehend existiert und nur im Kontext einer größeren Abfrage verwendet wird. Ähnlich wie bei einer abgeleiteten Tabelle wird das Ergebnis eines CTE nicht gespeichert und existiert nur für die Dauer der Abfrage. Dieser Artikel konzentriert sich auf nicht-rekursive CTEs.
Wie hilfreich sind CTEs?
CTEs, wie Datenbankansichten und abgeleitete Tabellen, ermöglichen es Benutzern, komplexe Abfragen durch verbesserte Lesbarkeit und Vereinfachung einfacher zu schreiben und zu verwalten. Diese Verringerung der Komplexität wird erreicht, indem normalerweise komplexe Abfragen in einfache Blöcke zerlegt werden, die beim Umschreiben der Abfrage verwendet und gegebenenfalls wiederverwendet werden. Beispiele für Anwendungsfälle sind:
- Mehrmaliges Verweisen auf eine abgeleitete Tabelle in einer einzigen Abfrage
- Alternative zum Erstellen einer Ansicht in der Datenbank
- Durchführen derselben Berechnung mehrmals über mehrere Abfragekomponenten hinweg
So erstellen Sie einen CTE
- Initiieren Sie einen CTE mit „WITH“
- Geben Sie einen Namen für das Ergebnis der bald zu definierenden Abfrage an
- Nachdem Sie einen Namen vergeben haben, folgen Sie mit „AS“
- Spaltennamen angeben (optionaler Schritt)
- Definieren Sie die Abfrage, um die gewünschte Ergebnismenge zu erzeugen
- Wenn mehrere CTEs erforderlich sind, beginnen Sie jeden nachfolgenden Ausdruck mit einem Komma und wiederholen Sie die Schritte 2-4.
- In einer nachfolgenden Abfrage auf die oben definierten CTE(s) verweisen
Syntax
WITH
expression_name_1 AS
(CTE query definition 1)
[, expression_name_X AS
(CTE query definition X)
, etc ]
SELECT expression_A, expression_B, ...
FROM expression_name_1
##Example CTEDie folgende Abfrage beantwortet die Geschäftsfrage:„Wie hoch sind die durchschnittlichen monatlichen Kosten pro Kampagne für die Marketingmaßnahmen des Unternehmens?“ Dies könnte mit einer abgeleiteten Abfrage (siehe unten) erreicht werden; die Verwendung eines CTE verbessert jedoch die Lesbarkeit
-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)
-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign
Verwendung einer abgeleiteten Abfrage:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
-- this is where the derived query is used
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign
Dokumentation
- Postgres
- Rotverschiebung
- Orakel
- SQLServer