WITH (Common Table Expression / CTE)
Oracle
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;WITH definiert innerhalb einer Abfrage eine benannte temporäre Ergebnismenge (CTE); statt eine Unterabfrage mehrfach zu schreiben, definierst du sie einmal und verweist per Name darauf. Komplexe Abfragen werden so in lesbare Teile zerlegt. Unterstützt seit Oracle 9i.
PostgreSQL
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;Eine CTE zerlegt komplexe Abfragen in benannte Blöcke. Vor PostgreSQL 12 war eine CTE eine Optimierungsbarriere (immer materialisiert); ab 12 kann sie inline aufgelöst werden, das alte Verhalten lässt sich mit WITH ... AS MATERIALIZED erzwingen.
MySQL
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;Eine CTE definiert innerhalb einer Abfrage eine temporäre benannte Ergebnismenge und verbessert die Lesbarkeit. Unterstützt ab MySQL 8.0 (und MariaDB 10.2); ältere Versionen erfordern eine Derived Table (Unterabfrage in FROM).
SQL Server
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;Eine CTE ist eine benannte temporäre Ergebnismenge. In SQL Server muss die unmittelbar vor einer CTE stehende Anweisung mit einem Semikolon enden, daher wird WITH oft als ';WITH' geschrieben. Sie gilt für die Dauer einer einzelnen Anweisung (SELECT/INSERT/UPDATE/DELETE).
MongoDB
// Closest equivalent: aggregation pipeline stages
db.customer.aggregate([
{ $group: { _id: "$city", n: { $sum: 1 } } },
{ $match: { n: { $gt: 10 } } }
])MongoDB hat kein SQL/keine CTE; die Stages der Aggregation Pipeline übernehmen diese Aufgabe. Jede Stage nimmt die Ausgabe der vorherigen als Eingabe, was eine schrittweise Verarbeitung ähnlich CTE-Ketten ergibt. Für Zwischenergebnisse lassen sich auch $facet oder $lookup nutzen.
Redis
# Not applicable: Redis has no concept of SQL or CTEs.Redis ist ein Key-Value-Datenspeicher ohne Abfragesprache. Zwischenergebnisse kombinierst du clientseitig, oder du nutzt ein Lua-Skript (EVAL) für serverseitige Logik.
Elasticsearch
# CTEs are not supported in Elasticsearch SQL.
POST _sql
{ "query": "SELECT city, COUNT(*) n FROM customer GROUP BY city HAVING COUNT(*) > 10" }Elasticsearch SQL (die _sql API) unterstützt keine WITH-/CTE-Syntax; Gruppierung und Filterung werden in einem einzigen SELECT geschrieben. Nativ erfolgt dasselbe mit einer 'terms'-Aggregation und einer Pipeline-Aggregation 'bucket_selector'.