Dokumentacja PostgreSQL na WITH pokazuje następujący przykład:
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;
Zwraca również uwagę:
Przydatną właściwością zapytań WITH jest to, że są one oceniane tylko raz na wykonanie zapytania nadrzędnego, nawet jeśli odwołuje się do nich więcej niż raz przez zapytanie nadrzędne lub rodzeństwo Z zapytaniami rodzicielskimi.
Widzę, że WITH
można to wykorzystać do innych rzeczy, takich jak ocena rekurencyjna. Ale czy w powyższym przykładzie jest jakaś istotna różnica między używaniem WITH
a tworzeniem tabel tymczasowych?
TEMPORARY TABLE
z ON COMMIT DROP
zapytaniem, to tylko kwestia modyfikacji zapytania i ponownego uruchomienia, prawda? postgresql.org/docs/9.6/static/sql-createtable.html
SELECT
poWITH
prostu polega na wpisaniu nazwy i ponownym uruchomieniu. Przy tymczasowym stole zajmie toDROP
iCREATE
. Z drugiej strony, jeśli budujesz zapytanie i zamierzasz wielokrotnie wykorzystywać dane statyczne - budowanie tabeli tymczasowej z indeksami jest zdecydowanie korzystne w stosunku do CTE.