Dalam pertanyaan yang mendapatkan semula berbilang lajur daripada jadual, adalah wajar untuk mengecualikan baris pendua berdasarkan lajur tertentu sambil mengekalkan nilai yang berbeza dalam lajur lain. Ini boleh mencabar kerana klausa tradisional seperti DISTINCT dan GROUP BY beroperasi pada keseluruhan baris.
Untuk menangani keperluan ini, fungsi ROW_NUMBER() boleh digunakan. Fungsi ini memberikan nombor jujukan unik kepada setiap baris dalam partition yang ditakrifkan oleh lajur tertentu. Dengan menggabungkan ROW_NUMBER() dengan klausa PARTITION BY dan ORDER BY, anda boleh membuat penarafan baris dalam setiap partition berdasarkan nilai dalam lajur yang dikehendaki.
Pertimbangkan pertanyaan berikut:
SELECT ID, Email, ProductName, ProductModel FROM Products
Untuk mengubah suai pertanyaan ini supaya ia hanya mengembalikan e-mel unik, kami boleh menggunakan yang berikut kod:
SELECT * FROM ( SELECT ID, Email, ProductName, ProductModel, ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) AS rn FROM Products ) AS a WHERE rn = 1
Fungsi ROW_NUMBER() membahagikan keputusan kepada partition berdasarkan lajur E-mel dan memberikan setiap baris kedudukan unik dalam partitionnya. Klausa ORDER BY seterusnya memastikan baris terakhir yang berlaku dalam setiap partition diletakkan di kedudukan pertama. Klausa WHERE akhir menapis hasil untuk hanya memasukkan baris dengan kedudukan 1, dengan berkesan menghapuskan e-mel pendua.
Pendekatan ini membolehkan anda menentukan mana-mana lajur sebagai asas untuk pembahagian dan pemeringkatan, memberikan fleksibiliti dalam menyesuaikan pertanyaan mengikut keperluan khusus anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghapuskan E-mel Pendua dalam Pernyataan SELECT SQL Semasa Mengekalkan Data Lajur Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!