The PostgreSQL dokumentasi di DENGAN menunjukkan contoh berikut:
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;
Itu juga mencatat:
Properti yang berguna dari kueri WITH adalah bahwa mereka dievaluasi hanya sekali per eksekusi kueri induk, bahkan jika itu dirujuk lebih dari sekali oleh kueri induk atau saudara kueri DENGAN queri.
Saya melihat itu WITH
dapat digunakan untuk hal-hal lain, seperti evaluasi rekursif. Tetapi dalam contoh di atas, apakah ada perbedaan penting antara menggunakan WITH
dan membuat tabel sementara?
postgresql
Nathan Long
sumber
sumber
SELECT
dalamWITH
hanyalah mengetikkan nama dan menjalankan kembali. Sementara dengan meja sementara dibutuhkanDROP
danCREATE
. Di sisi lain jika Anda membangun kueri dan Anda akan menggunakan kembali data statis banyak kali - membangun tabel sementara dengan indeks jelas bermanfaat melawan CTE.TEMPORARY TABLE
denganON COMMIT DROP
dalam kueri, itu juga hanya masalah memodifikasi kueri dan menjalankan kembali, kan? postgresql.org/docs/9.6/static/sql-createtable.htmlJawaban:
Ada beberapa perbedaan halus, tetapi tidak ada yang drastis:
ON COMMIT DROP
, transaksi),WITH
yang selalu dibatasi ketat untuk kueri;WITH
tabel-ekspresi;VACUUM
karya pada katalog sistem yangWITH
tidak, perlu round trip tambahan untuk membuat / mengisinya, dan itu membutuhkan kerja ekstra dalam manajemen cache server, sehingga sedikit kurang efisien.Secara keseluruhan, Anda harus memilih
WITH
untuk temp tabel kecuali Anda tahu Anda akan mendapat manfaat dari membuat indeks.Namun, opsi lainnya, subquery dalam
FROM
klausa, memiliki serangkaian keunggulan yang sangat berbeda. Ini dapat digarisbawahi, khususnya, dan kualifikasi dapat ditarik ke atas / ditekan ke bawah. Saya menulis tentang ini di artikel blog terbaru .sumber