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?
postgresql
Nathan Long
fuente
fuente

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.TEMPORARY TABLEconON 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.htmlRespuestas:
Hay algunas diferencias sutiles, pero nada drástico:
ON COMMIT DROPtransacción),WITHsiempre que se limite estrictamente a la consulta;WITHde mesa expresiones;VACUUMtrabajo en los catálogos del sistema queWITHno lo hace, necesita un viaje de ida y vuelta adicional para crearlo / llenarlo, y requiere un trabajo adicional en la administración de la memoria caché del servidor, por lo que es un poco menos eficiente.En general, debe preferir las
WITHtablas temporales a menos que sepa que se beneficiará al crear un índice.Sin embargo, la otra opción, una subconsulta en la
FROMcláusula, tiene un conjunto muy diferente de ventajas. Puede estar en línea, en particular, y los calificadores se pueden subir / bajar. Escribí sobre esto en un artículo de blog reciente .fuente