La documentation PostgreSQL sur WITH montre l'exemple suivant:
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;
Il note également:
Une propriété utile des requêtes WITH est qu'elles ne sont évaluées qu'une seule fois par exécution de la requête parent, même si elles sont référencées plusieurs fois par la requête parent ou les requêtes WITH avec frère.
Je vois que cela WITHpeut être utilisé pour d'autres choses, comme une évaluation récursive. Mais dans l'exemple ci-dessus, y a-t-il une différence importante entre l'utilisation WITHet la création de tables temporaires?
TEMPORARY TABLEavec ON COMMIT DROPdans une requête, il suffit également de modifier la requête et de la relancer, non? postgresql.org/docs/9.6/static/sql-createtable.html
SELECTin neWITHfait que taper le nom et la relancer. Alors qu'avec une table temporaire, il faudraitDROPetCREATE. D'un autre côté, si vous construisez une requête et que vous allez réutiliser des données statiques de nombreuses fois - la construction d'une table temporaire avec des index est certainement bénéfique contre CTE.