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 define un conjunto de resultados temporal con nombre (CTE) dentro de una consulta; en lugar de escribir una subconsulta repetidamente, se define una vez y se referencia por su nombre. Divide las consultas complejas en partes legibles. Soportado desde Oracle 9i.
PostgreSQL
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;Una CTE divide las consultas complejas en bloques con nombre. Antes de PostgreSQL 12 una CTE era una barrera de optimización (siempre se materializaba); a partir de 12 puede integrarse en línea, y el comportamiento antiguo se puede forzar con WITH ... AS MATERIALIZED.
MySQL
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;Una CTE define un conjunto de resultados temporal con nombre dentro de una consulta y mejora la legibilidad. Soportado a partir de MySQL 8.0 (y MariaDB 10.2); las versiones anteriores requieren una derived table (una subconsulta en FROM).
SQL Server
WITH region AS (
SELECT city, COUNT(*) AS n
FROM customer
GROUP BY city
)
SELECT city, n FROM region WHERE n > 10;Una CTE es un conjunto de resultados temporal con nombre. En SQL Server, la sentencia inmediatamente anterior a una CTE debe terminar con punto y coma, por eso WITH se escribe a menudo como ';WITH'. Es válida durante una sola sentencia (SELECT/INSERT/UPDATE/DELETE).
MongoDB
// Closest equivalent: aggregation pipeline stages
db.customer.aggregate([
{ $group: { _id: "$city", n: { $sum: 1 } } },
{ $match: { n: { $gt: 10 } } }
])MongoDB no tiene SQL/CTE; las etapas del aggregation pipeline cumplen la misma función. Cada etapa toma como entrada la salida de la anterior, lo que da un procesamiento paso a paso similar a las cadenas de CTE. También se pueden usar $facet o $lookup para resultados intermedios.
Redis
# Not applicable: Redis has no concept of SQL or CTEs.Redis es un almacén de datos clave-valor sin lenguaje de consulta. Los resultados intermedios se combinan en el lado del cliente, o se usa un script Lua (EVAL) para la lógica en el servidor.
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 (la API _sql) no admite la sintaxis WITH/CTE; la agrupación y el filtrado se escriben en un único SELECT. Con el enfoque nativo, lo mismo se hace con una agregación 'terms' y una pipeline aggregation 'bucket_selector'.