Документація PostgreSQL на ЗО показує наступний приклад:
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;
Він також зазначає:
Корисна властивість запитів WITH полягає в тому, що вони оцінюються лише один раз за виконання батьківського запиту, навіть якщо на них більше одного разу звертається батьківський запит або однорідний запит.
Я бачу, що це WITHможе бути використане для інших речей, наприклад рекурсивного оцінювання. Але чи є в наведеному прикладі якась важлива різниця між використанням WITHта створенням тимчасових таблиць?
TEMPORARY TABLEз ON COMMIT DROPзапитом, це також лише питання зміни запиту та повторного запуску, правда? postgresql.org/docs/9.6/static/sql-createtable.html
SELECTвWITHпросто вводить ім’я та повторний запуск. Хоча з тимчасовим столом знадобитьсяDROPіCREATE. З іншого боку, якщо ви будуєте запит і збираєтеся багато разів використовувати статичні дані - створення тимчасової таблиці з індексами безумовно вигідно проти CTE.