Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menyelesaikan Ralat 'SELECT DISTINCT ON' PostgreSQL mesti sepadan dengan ungkapan ORDER BY awal?

Bagaimana untuk Menyelesaikan Ralat 'SELECT DISTINCT ON' PostgreSQL mesti sepadan dengan ungkapan ORDER BY awal?

Linda Hamilton
Lepaskan: 2025-01-21 12:17:09
asal
265 orang telah melayarinya

How to Resolve PostgreSQL's

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan