Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hapus baris duplikat meninggalkan baris terlama Saja?

Karena Anda menggunakan kolom id sebagai indikator catatan mana yang 'asli':

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Ini akan meninggalkan satu catatan per alamat email.

edit untuk menambahkan:

Untuk menjelaskan pertanyaan di atas...

Idenya di sini adalah untuk bergabung dengan meja melawan dirinya sendiri. Berpura-pura bahwa Anda memiliki dua salinan tabel, masing-masing bernama sesuatu yang berbeda. Kemudian Anda dapat membandingkannya satu sama lain, dan menemukan id terendah atau untuk setiap alamat email. Anda kemudian akan melihat rekaman duplikat yang dibuat nanti dan dapat menghapusnya. (Saya sedang memvisualisasikan Excel ketika memikirkan hal ini.)

Untuk melakukan operasi itu di atas meja, membandingkannya dengan dirinya sendiri dan dapat mengidentifikasi setiap sisi, Anda menggunakan alias tabel. x adalah alias tabel. Itu ditetapkan dalam from klausa seperti ini:from <table> <alias> . x sekarang dapat digunakan di tempat lain dalam kueri yang sama untuk merujuk ke tabel itu sebagai jalan pintas.

delete x memulai kueri dengan tindakan dan target kita. Kami akan melakukan kueri untuk memilih rekaman dari beberapa tabel, dan kami ingin menghapus rekaman yang muncul di x .

Alias ​​​​digunakan untuk merujuk ke kedua 'contoh' tabel. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail membenturkan tabel dengan dirinya sendiri di mana email cocok. Tanpa klausa where yang mengikuti, setiap record akan dipilih karena dapat digabungkan dengan dirinya sendiri.

where klausa membatasi catatan yang dipilih. where x.id > z.id memungkinkan 'instance' alias x hanya berisi catatan yang cocok dengan email tetapi memiliki id yang lebih tinggi nilai. Data yang sangat Anda inginkan dalam tabel, alamat email unik (dengan id terendah) tidak akan menjadi bagian dari x dan tidak akan dihapus. Satu-satunya catatan di x akan menjadi catatan duplikat (alamat email) yang memiliki id yang lebih tinggi daripada catatan asli untuk alamat email tersebut.

Gabung dan di mana klausa dapat digabungkan dalam kasus ini:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Untuk mencegah duplikat, pertimbangkan untuk membuat kolom subscriberEmail sebagai kolom terindeks UNIK.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Python dan MySQL dalam Proses ETL

  2. Bagaimana memberikan semua hak istimewa untuk me-root pengguna di MySQL 8.0

  3. Tomcat7:Tidak dapat memuat kelas driver JDBC [com.mysql.jdbc.Driver]

  4. MySQL ON UPDATE CURRENT_TIMESTAMP tidak memperbarui

  5. SQLAlchemy:Cara Menghapus dengan bergabung