Документация PostgreSQL по WITH показывает следующий пример:
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
может быть использовано для других целей, таких как рекурсивная оценка. Но в приведенном выше примере, есть ли важное различие между использованием WITH
и созданием временных таблиц?
TEMPORARY TABLE
с ON COMMIT DROP
внутри запроса, это также вопрос модификации запроса и повторного запуска, верно? postgresql.org/docs/9.6/static/sql-createtable.html
SELECT
inWITH
просто вводит имя и перезапускается. Хотя с временной таблицей это заняло быDROP
иCREATE
. С другой стороны, если вы строите запрос и собираетесь многократно использовать статические данные - создание временной таблицы с индексами определенно выгодно для CTE.