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 WITH
può essere utilizzato per altre cose, come la valutazione ricorsiva. Ma nell'esempio sopra, c'è qualche differenza importante tra l'utilizzo WITH
e la creazione di tabelle temporanee?
TEMPORARY TABLE
con ON COMMIT DROP
all'interno di una query, è anche solo questione di modificare la query e rieseguirla, giusto? postgresql.org/docs/9.6/static/sql-createtable.html
SELECT
inWITH
è semplicemente digitando il nome e rieseguendo. Mentre con tabella temporanea ci vorrebbeDROP
eCREATE
. 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.