sql >> Database >  >> RDS >> Mysql

Dubbele rijen verwijderen en alleen de oudste rij verlaten?

Aangezien je de id-kolom gebruikt als indicator van welk record 'origineel' is:

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

Hierdoor blijft er één record over per e-mailadres.

bewerken om toe te voegen:

Om bovenstaande vraag uit te leggen...

Het idee hier is om tegen zichzelf aan tafel te gaan zitten. Doe alsof je twee exemplaren van de tabel hebt, elk met een andere naam. Dan zou je ze met elkaar kunnen vergelijken en de laagste id voor elk e-mailadres vinden. U ziet dan de dubbele records die later zijn gemaakt en kunt ze verwijderen. (Ik visualiseerde Excel toen ik hieraan dacht.)

Om die bewerking op een tafel uit te voeren, deze met zichzelf te vergelijken en elke zijde te kunnen identificeren, gebruikt u tabelaliassen. x is een tabelalias. Het wordt toegewezen in de from clausule als volgt:from <table> <alias> . x kan nu elders in dezelfde query worden gebruikt om naar die tabel te verwijzen als een snelkoppeling.

delete x begint de zoekopdracht met onze actie en doel. We gaan een query uitvoeren om records uit meerdere tabellen te selecteren en we willen records verwijderen die voorkomen in x .

Aliassen worden gebruikt om naar beide 'instanties' van de tabel te verwijzen. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail stoot de tafel tegen zichzelf aan waar de e-mails overeenkomen. Zonder de waar-clausule die volgt, zou elk record worden geselecteerd omdat het tegen zichzelf zou kunnen worden samengevoegd.

De where clausule beperkt de records die zijn geselecteerd. where x.id > z.id staat de 'instance' met de alias x toe om alleen de records te bevatten die overeenkomen met e-mails maar een hogere id hebben waarde. De gegevens die u echt in de tabel wilt hebben, unieke e-mailadressen (met de laagste id) maken geen deel uit van x en wordt niet verwijderd. De enige records in x zullen dubbele records (e-mailadressen) zijn met een hogere id dan het oorspronkelijke record voor dat e-mailadres.

De join en where-clausules kunnen in dit geval worden gecombineerd:

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

Overweeg om van de kolom subscriberEmail een UNIEKE geïndexeerde kolom te maken om duplicaten te voorkomen.



  1. link weergeven in php

  2. MariaDB Cluster offline installatie voor CentOS

  3. Oracle - Waarom verdwijnt de voorloopnul van een getal bij het converteren naar TO_CHAR

  4. Grootte voor het opslaan van IPv4-, IPv6-adressen als een string