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 WITHse puede usar para otras cosas, como la evaluación recursiva. Pero en el ejemplo anterior, ¿hay alguna diferencia importante entre usar WITHy crear tablas temporales?
TEMPORARY TABLEcon ON COMMIT DROPuna 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
SELECTenWITHapenas está escribiendo el nombre y volver a ejecutar. Mientras que con la tabla temporal tomaríaDROPyCREATE. 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.