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?
postgresql
Nathan Long
źródło
źródło
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.TEMPORARY TABLE
zON COMMIT DROP
zapytaniem, to tylko kwestia modyfikacji zapytania i ponownego uruchomienia, prawda? postgresql.org/docs/9.6/static/sql-createtable.htmlOdpowiedzi:
Istnieje kilka subtelnych różnic, ale nic drastycznego:
ON COMMIT DROP
transakcja), wherasWITH
zawsze jest ściśle ograniczony do zapytania;WITH
tabel wyrażeń;VACUUM
pracę w katalogach systemowych, któraWITH
tego nie robi, potrzebuje dodatkowej podróży w obie strony, aby ją utworzyć / wypełnić i wymaga dodatkowej pracy w zarządzaniu pamięcią podręczną serwera, więc jest nieco mniej wydajna.Ogólnie rzecz biorąc, powinieneś preferować
WITH
tabele tymczasowe, chyba że wiesz, że skorzystasz na stworzeniu indeksu.Jednak druga opcja, podzapytanie w
FROM
klauzuli, ma zupełnie inny zestaw zalet. W szczególności można go wstawiać, a kwalifikatory można podciągać / przesuwać w dół. Pisałem o tym w ostatnim artykule na blogu .źródło