La documentazione PostgreSQL su WITH mostra il seguente esempio:
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;
Nota inoltre:
Una proprietà utile delle query WITH è che vengono valutate una sola volta per esecuzione della query principale, anche se vengono richiamate più di una volta dalla query principale o dalle query WITH di pari livello.
Vedo che WITHpuò essere utilizzato per altre cose, come la valutazione ricorsiva. Ma nell'esempio sopra, c'è qualche differenza importante tra l'utilizzo WITHe la creazione di tabelle temporanee?
TEMPORARY TABLEcon ON COMMIT DROPall'interno di una query, è anche solo questione di modificare la query e rieseguirla, giusto? postgresql.org/docs/9.6/static/sql-createtable.html
SELECTinWITHè semplicemente digitando il nome e rieseguendo. Mentre con tabella temporanea ci vorrebbeDROPeCREATE. D'altra parte, se si crea una query e si intende riutilizzare i dati statici molte volte, la creazione di una tabella temporanea con indici è sicuramente vantaggiosa per CTE.