Mengambil semula Semua Lajur Menggunakan DISTINCT dalam Pertanyaan SQL
Kata kunci DISTINCT
dalam SQL mengalih keluar baris pendua berdasarkan lajur yang ditentukan. Walau bagaimanapun, mendapatkan semua lajur sambil hanya menunjukkan nilai yang berbeza dalam subset lajur memerlukan pertimbangan yang teliti. Hanya menggunakan SELECT DISTINCT *
tidak disokong dengan pasti merentas semua sistem pangkalan data.
Penyelesaian untuk Mendapatkan Lajur Lengkap dengan DISTINCT
Beberapa kaedah wujud untuk mencapai ini, bergantung pada sistem pangkalan data khusus anda:
ROW_NUMBER()
dalam subkueri:<code class="language-sql">SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS row_number FROM table ) AS rows WHERE row_number = 1;</code>
Ini memberikan nombor baris unik dalam setiap partition (ditakrifkan oleh field1
), dipesan oleh field2
. Pertanyaan luar kemudian memilih hanya baris pertama daripada setiap partition. Gantikan field1
dan field2
dengan lajur anda yang sesuai.
GROUP BY
boleh berfungsi, tetapi hanya jika anda boleh menjamin bahawa semua lajur lain mempunyai nilai yang sama untuk setiap gabungan berbeza lajur terkumpul. Ini selalunya tidak berlaku dan boleh membawa kepada keputusan yang tidak dapat diramalkan.<code class="language-sql">SELECT * FROM table GROUP BY field1;</code>
DISTINCT ON
, penyelesaian yang lebih langsung:<code class="language-sql">SELECT DISTINCT ON (field1) * FROM table;</code>
Ini hanya memilih baris pertama untuk setiap nilai berbeza field1
.
<code class="language-sql">SELECT * FROM table AS t1 INNER JOIN table AS t2 ON t1.field1 = t2.field1 INNER JOIN (SELECT field1, MIN(field2) AS min_field2 FROM table GROUP BY field1) AS distinct_fields ON t1.field1 = distinct_fields.field1 AND t1.field2 = distinct_fields.min_field2;</code>
Ini mencari nilai minimum field2
untuk setiap field1
yang berbeza dan menggabungkannya kembali ke jadual asal. Anda mungkin perlu melaraskan fungsi MIN()
bergantung pada tingkah laku yang anda inginkan.
Ingat untuk menggantikan "table"
, "field1"
dan "field2"
dengan nama jadual dan lajur sebenar anda. Pendekatan terbaik bergantung pada sistem pangkalan data khusus anda dan gelagat yang diingini apabila berbilang baris mempunyai nilai berbeza yang sama dalam lajur yang ditentukan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Semua Lajur dalam Pertanyaan SQL Menggunakan DISTINCT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!