PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara menghapus baris duplikat tanpa pengenal unik

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]')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan Postgresql Sederhana - nama kolom tidak ada

  2. Bagaimana Round() Bekerja di PostgreSQL

  3. Cara Menyebarkan Distribusi Percona untuk PostgreSQL untuk Ketersediaan Tinggi

  4. Rails:Tidak ada kumpulan koneksi untuk ActiveRecord::Base

  5. Bagaimana cara menambahkan jumlah hari kerja ke tanggal tertentu