Saya suka solusi @erwin-brandstetter, tetapi ingin menunjukkan solusi dengan USING
kata kunci:
DELETE FROM table_with_dups T1
USING table_with_dups T2
WHERE T1.ctid < T2.ctid -- delete the "older" ones
AND T1.name = T2.name -- list columns that define duplicates
AND T1.address = T2.address
AND T1.zipcode = T2.zipcode;
Jika Anda ingin meninjau catatan sebelum menghapusnya, cukup ganti DELETE
dengan SELECT *
dan USING
dengan koma ,
, yaitu
SELECT * FROM table_with_dups T1
, table_with_dups T2
WHERE T1.ctid < T2.ctid -- select the "older" ones
AND T1.name = T2.name -- list columns that define duplicates
AND T1.address = T2.address
AND T1.zipcode = T2.zipcode;
Pembaruan:Saya menguji beberapa solusi berbeda di sini untuk kecepatan. Jika Anda tidak mengharapkan banyak duplikat, maka solusi ini bekerja jauh lebih baik daripada solusi yang memiliki NOT IN (...)
klausa seperti yang menghasilkan banyak baris di subquery.
Jika Anda menulis ulang kueri untuk menggunakan IN (...)
kemudian ia melakukan hal yang sama dengan solusi yang disajikan di sini, tetapi kode SQL menjadi kurang ringkas.
Pembaruan 2:Jika Anda memiliki NULL
nilai di salah satu kolom kunci (yang sebenarnya tidak boleh Anda IMO), maka Anda dapat menggunakan COALESCE()
dalam kondisi untuk kolom itu, mis.
AND COALESCE(T1.col_with_nulls, '[NULL]') = COALESCE(T2.col_with_nulls, '[NULL]')