A documentação do PostgreSQL sobre 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 pelas consultas irmãs WITH.
Vejo que WITH
pode ser usado para outras coisas, como avaliação recursiva. Mas no exemplo acima, existe alguma diferença importante entre usar WITH
e criar tabelas temporárias?
Existem algumas diferenças sutis, mas nada drástico:
ON COMMIT DROP
, transação), enquantoWITH
o escopo sempre é estritamente definido para a consulta;WITH
expressão de tabela;VACUUM
trabalho nos catálogos do sistema queWITH
não, ela precisa de uma ida e volta extra para criá-la/preenchê-la e requer trabalho extra no gerenciamento de cache do servidor, portanto, é um pouco menos eficiente.No geral, você deve preferir
WITH
tabelas temporárias, a menos que saiba que se beneficiará da criação de um índice.No entanto, a outra opção, uma subconsulta na
FROM
cláusula, tem um conjunto muito diferente de vantagens. Ele pode ser embutido, em particular, e os qualificadores podem ser puxados para cima / empurrados para baixo. Escrevi sobre isso em um artigo de blog recente .