¿Qué son las expresiones de tabla comunes (CTE)?
Una Expresión de tabla común (CTE) es el conjunto de resultados de una consulta que existe temporalmente y para usar solo dentro del contexto de una consulta más grande. Al igual que una tabla derivada, el resultado de una CTE no se almacena y existe solo durante la consulta. Este artículo se centrará en CTE no recurrentes.
¿Cómo son útiles los CTE?
Los CTE, como las vistas de la base de datos y las tablas derivadas, permiten a los usuarios escribir y mantener consultas complejas más fácilmente a través de una mayor legibilidad y simplificación. Esta reducción de la complejidad se logra al deconstruir consultas normalmente complejas en bloques simples para usar y reutilizar si es necesario, al reescribir la consulta. Ejemplos de casos de uso incluyen:
- Necesitar hacer referencia a una tabla derivada varias veces en una sola consulta
- Una alternativa a la creación de una vista en la base de datos
- Realizar el mismo cálculo varias veces en varios componentes de consulta
Cómo crear un CTE
- Iniciar un CTE usando "CON"
- Proporcione un nombre para el resultado de la consulta que pronto se definirá
- Después de asignar un nombre, siga con "AS"
- Especifique los nombres de las columnas (paso opcional)
- Defina la consulta para producir el conjunto de resultados deseado
- Si se requieren varios CTE, inicie cada expresión subsiguiente con una coma y repita los pasos 2 a 4.
- Haga referencia a los CTE definidos anteriormente en una consulta posterior
Sintaxis
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
##Ejemplo CTELa siguiente consulta responde la pregunta comercial:"¿cuál es el costo mensual promedio por campaña para los esfuerzos de marketing de la empresa?" Esto podría lograrse con una consulta derivada (que se muestra a continuación); sin embargo, usar un CTE mejora la legibilidad
-- 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
Usando una consulta derivada:
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
Documentación
- Postgres
- Desplazamiento al rojo
- Oráculo
- Servidor SQL