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 WITH
peut ê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 WITH
et la création de tables temporaires?
TEMPORARY TABLE
avec ON COMMIT DROP
dans 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
SELECT
in neWITH
fait que taper le nom et la relancer. Alors qu'avec une table temporaire, il faudraitDROP
etCREATE
. 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.