PostgreSQL DISTINCT ON
Ralat: Tidak Padan ORDER BY
Klausa
Menggunakan DISTINCT ON
PostgreSQL dengan klausa ORDER BY
yang mengandungi ungkapan berbeza boleh membawa kepada ralat: "SELECT DISTINCT ON ekspresi mesti sepadan dengan ungkapan ORDER BY awal." Ini berlaku kerana DISTINCT ON
memilih baris unik berdasarkan lajur yang ditentukan, manakala ORDER BY
menentukan susunan pembentangan baris unik tersebut. Oleh itu, lajur dalam DISTINCT ON
mesti sepadan dengan lajur utama dalam klausa ORDER BY
.
Sebagai contoh, jika anda perlu mendapatkan semula nilai address_id
yang berbeza sambil mengutamakan baris dengan cap masa purchased_at
terkini, hanya mengisih mengikut address_id
dalam klausa ORDER BY
tidak mencukupi apabila menggunakan DISTINCT ON (address_id)
. Ini kerana DISTINCT ON
akan memilih baris pertama untuk setiap address_id
yang ditemui mengikut klausa ORDER BY
.
Berikut ialah dua penyelesaian yang berkesan:
Kaedah 1: Subkueri untuk Maksimum purchased_at
Pendekatan ini menggunakan subkueri untuk mencari purchased_at
maksimum bagi setiap address_id
, kemudian menggabungkan hasil ini kembali ke jadual asal untuk memilih baris yang sepadan:
<code class="language-sql">SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, MAX(purchased_at) AS max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;</code>
Kaedah 2: Pertanyaan Bersarang dengan DISTINCT ON
dan ORDER BY
Penyelesaian khusus PostgreSQL ini menggunakan pertanyaan bersarang. Pertanyaan dalam menggunakan DISTINCT ON
untuk memilih baris unik yang diingini, disusun dengan betul dan pertanyaan luar menyusun semula keputusan:
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;</code>
Kedua-dua kaedah memberikan hasil yang cekap dan tepat, mengatasi had yang dikenakan dengan menggabungkan klausa DISTINCT ON
dan ORDER BY
yang tidak sepadan secara langsung. Pilih kaedah yang paling sesuai dengan gaya pengekodan dan keperluan prestasi pangkalan data anda.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'SELECT DISTINCT ON' PostgreSQL mesti sepadan dengan ungkapan ORDER BY awal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!