sql >> Database teknologi >  >> RDS >> Mysql

Fjern duplikerede rækker og forlader kun den ældste række?

Da du bruger id-kolonnen som en indikator for, hvilken post der er 'original':

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

Dette vil efterlade én post pr. e-mailadresse.

rediger for at tilføje:

For at forklare forespørgslen ovenfor...

Ideen her er at slutte sig til bordet mod sig selv. Lad som om, at du har to kopier af bordet, som hver hedder noget forskelligt. Så kan du sammenligne dem med hinanden og finde det laveste id eller for hver e-mailadresse. Du vil så se de duplikerede poster, der blev oprettet senere, og kunne slette dem. (Jeg visualiserede Excel, da jeg tænkte på dette.)

For at udføre den handling på en tabel, sammenligne den med sig selv og være i stand til at identificere hver side, bruger du tabelaliasser. x er et bordalias. Det er tildelt i fra klausul som sådan:fra

. x kan nu bruges andre steder i den samme forespørgsel til at henvise til den tabel som en genvej.

slet x starter forespørgslen med vores handling og mål. Vi skal udføre en forespørgsel for at vælge poster fra flere tabeller, og vi ønsker at slette poster, der vises i x .

Aliaser bruges til at henvise til begge 'forekomster' af tabellen. fra myTable x join myTable z på x.subscriberEmail =z.subscriberEmail støder bordet op mod sig selv, hvor e-mails matcher. Uden hvor-klausulen, der følger, ville hver post blive valgt, da den kunne slås sammen mod sig selv.

hvor klausul begrænser de poster, der vælges. hvor x.id> z.id tillader "instansen" kaldet x kun at indeholde de poster, der matcher e-mails, men som har et højere id værdi. De data, du virkelig ønsker i tabellen, unikke e-mailadresser (med det laveste id) vil ikke være en del af x og vil ikke blive slettet. De eneste poster i x vil være duplikerede poster (e-mail-adresser), der har et højere id end den oprindelige post for den e-mailadresse.

Klausulerne join og where kunne kombineres i dette tilfælde:

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

For at forhindre dubletter bør du overveje at gøre kolonnen SubscriberEmail til en UNIK indekseret kolonne.



  1. Parsing af tabel- og kolonnenavne fra SQL/HQL Java

  2. Android:Hvordan beder man en markør om at opdatere ListView efter sletning af databaserækken?

  3. Hvordan ændrer du datatypen for en kolonne i SQL Server?

  4. hvordan man binder dynamisk json til treeview wpf