La documentación de PostgreSQL en WITH muestra el siguiente ejemplo:
WITH regional_sales AS (
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region
), top_regions AS (
SELECT region
FROM regional_sales
WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
product,
SUM(quantity) AS product_units,
SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
También señala:
Una propiedad útil de las consultas WITH es que se evalúan solo una vez por ejecución de la consulta principal, incluso si la consulta principal o las consultas de hermanos se refieren a ellas más de una vez.
Veo que WITH
se puede usar para otras cosas, como la evaluación recursiva. Pero en el ejemplo anterior, ¿hay alguna diferencia importante entre usar WITH
y crear tablas temporales?
TEMPORARY TABLE
con ON COMMIT DROP
una consulta, también es solo cuestión de modificar la consulta y volver a ejecutarla, ¿verdad? postgresql.org/docs/9.6/static/sql-createtable.html
SELECT
enWITH
apenas está escribiendo el nombre y volver a ejecutar. Mientras que con la tabla temporal tomaríaDROP
yCREATE
. Por otro lado, si crea una consulta y va a reutilizar datos estáticos muchas veces, crear una tabla temporal con índices es definitivamente beneficioso contra CTE.