sql >> Database teknologi >  >> RDS >> SQLite

2 måder at slette duplikerede rækker i SQLite

Følgende muligheder kan bruges til at slette dublerede rækker i SQLite.

Disse eksempler sletter duplikerede rækker, men beholder én. Så hvis der for eksempel er tre identiske rækker, sletter den to af dem og beholder en. Dette omtales ofte som de-duping af bordet.

Eksempeldata

Antag, at vi har en tabel med følgende data:

SELECT * FROM Pets;

Resultat:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    
4      Bark     Dog    
4      Bark     Dog    

Vi kan se, at de første to rækker er dubletter, ligesom de sidste tre rækker.

I dette tilfælde er alle kolonner dubletter. Der er ingen primær nøgle. PetId kolonne se ud ligesom det kunne være en primær nøgle, men den indeholder faktisk duplikerede værdier. Derfor er det ikke en unik identifikator for hver række, og den kan ikke bruges som en primær nøgle.

Hvis der var en primær nøgle, ville den indeholde unikke værdier på tværs af alle rækker, og der ville ikke være nogen dubletter.

Under alle omstændigheder er der to muligheder for at finde og slette duplikerede rækker.

Valgmulighed 1

Før vi de-duperer tabellen, kan vi bruge følgende forespørgsel til at se, hvilke rækker der vil blive slettet:

SELECT * FROM Pets
WHERE EXISTS (
  SELECT 1 FROM Pets p2 
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
  AND Pets.rowid > p2.rowid
);

Resultat:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
4      Bark     Dog    
4      Bark     Dog    

Dette viser os, at tre rækker vil blive slettet, når vi de-duperer tabellen i næste trin.

For at slette de duplikerede værdier kan vi ændre ovenstående forespørgsel ved at erstatte SELECT * med DELETE :

DELETE FROM Pets
WHERE EXISTS (
  SELECT 1 FROM Pets p2 
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
  AND Pets.rowid > p2.rowid
);

SELECT * FROM Pets;

Resultat:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    

Tabellen er nu blevet de-duperet.

Som forventet er en af ​​duplikatrækkerne for vores hund "Wag" blevet slettet, og den anden forbliver. To af dubletrækkerne for "Bark" er også blevet slettet.

Grunden til, at vi var i stand til at gøre dette, er på grund af SQLites rowid . Som standard har hver række i SQLite en speciel kolonne, normalt kaldet rowid , der entydigt identificerer den pågældende række i tabellen. Medmindre det eksplicit er blevet fjernet fra tabellen, kan du bruge dette som en unik identifikator for hver række, hvilket gør det muligt for os at konstruere ovenstående forespørgsler. Det samme gælder for det næste eksempel.

Valgmulighed 2

Forudsat at tabellen er blevet gendannet med dens originale data (inklusive duplikerede rækker), er her en anden mulighed for at de-dupere den.

Tjek hvilke rækker der slettes:

SELECT * FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

Resultat:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
4      Bark     Dog    
4      Bark     Dog    

Slet nu disse rækker:

DELETE FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

SELECT * FROM Pets;

Resultat:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    

Bordet er blevet de-duperet.


  1. SQL-opdatering fra en tabel til en anden baseret på et ID-match

  2. Kunne ikke indlæse sql-moduler i databaseklyngen under PostgreSQL-installationen

  3. Hvordan bruger man en PostgreSQL container med eksisterende data?

  4. MySQL maksimalt hukommelsesforbrug