A documentação do PostgreSQL no WITH mostra o seguinte exemplo:
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;
Também observa:
Uma propriedade útil das consultas WITH é que elas são avaliadas apenas uma vez por execução da consulta pai, mesmo que sejam referidas mais de uma vez pela consulta pai ou pelo irmão FROM.
Vejo que WITHpode ser usado para outras coisas, como avaliação recursiva. Mas no exemplo acima, há alguma diferença importante entre usar WITHe criar tabelas temporárias?
TEMPORARY TABLEcom ON COMMIT DROPuma consulta, também é apenas uma questão de modificar a consulta e re-executar, certo? postgresql.org/docs/9.6/static/sql-createtable.html
SELECTinWITHé apenas digitar o nome e executar novamente. Enquanto com tabela temporária seria precisoDROPeCREATE. Por outro lado, se você criar uma consulta e reutilizar dados estáticos muitas vezes - criar tabelas temporárias com índices é definitivamente benéfico para o CTE.