sql >> Database >  >> RDS >> SQLite

2 manieren om dubbele rijen in SQLite te verwijderen

De volgende opties kunnen worden gebruikt om dubbele rijen in SQLite te verwijderen.

Deze voorbeelden verwijderen dubbele rijen, maar behouden er een. Dus als er bijvoorbeeld drie identieke rijen zijn, worden er twee verwijderd en blijft er één behouden. Dit wordt vaak het ontdubbelen van de tabel genoemd.

Voorbeeldgegevens

Stel dat we een tabel hebben met de volgende gegevens:

SELECT * FROM Pets;

Resultaat:

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

We kunnen zien dat de eerste twee rijen duplicaten zijn, net als de laatste drie rijen.

In dit geval zijn alle kolommen duplicaten. Er is geen primaire sleutel. De PetId kolom kan eruit zien alsof het een primaire sleutel zou kunnen zijn, maar het bevat eigenlijk dubbele waarden. Daarom is het geen unieke id voor elke rij en kan het niet als primaire sleutel worden gebruikt.

Als er een primaire sleutel was, zou deze unieke waarden in alle rijen bevatten en zouden er geen duplicaten zijn.

Hieronder staan ​​in ieder geval twee opties voor het vinden en verwijderen van dubbele rijen.

Optie 1

Voordat we de tabel ontdubbelen, kunnen we de volgende query gebruiken om te zien welke rij(en) worden verwijderd:

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
);

Resultaat:

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

Dit laat ons zien dat drie rijen zullen worden verwijderd wanneer we de tabel in de volgende stap ontdubbelen.

Om de dubbele waarden te verwijderen, kunnen we de bovenstaande zoekopdracht wijzigen door SELECT * . te vervangen met 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;

Resultaat:

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

De tafel is nu ontdubbeld.

Zoals verwacht is een van de dubbele rijen voor onze hond "Wag" verwijderd en de andere blijft. Twee van de dubbele rijen voor "Bark" zijn ook verwijderd.

De reden dat we dit konden doen, is vanwege SQLite's rowid . Standaard heeft elke rij in SQLite een speciale kolom, meestal de rowid , die die rij in de tabel op unieke wijze identificeert. Tenzij het expliciet uit de tabel is verwijderd, kunt u dit gebruiken als een unieke id voor elke rij, waardoor we de bovenstaande query's kunnen maken. Hetzelfde geldt voor het volgende voorbeeld.

Optie 2

Ervan uitgaande dat de tabel is hersteld met de oorspronkelijke gegevens (inclusief dubbele rijen), is er een andere optie om de tabel te ontdubbelen.

Controleer welke rijen worden verwijderd:

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

Resultaat:

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

Verwijder nu die rijen:

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

SELECT * FROM Pets;

Resultaat:

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

De tafel is ontdubbeld.


  1. 5 manieren om te controleren of een tabel bestaat in PostgreSQL

  2. Een enkel eindpunt maken voor uw PostgreSQL-replicatie-installatie met behulp van HAProxy

  3. Hoe Access 2019 werkt en hoe u ermee werkt

  4. Controleer of de huidige datum tussen twee data ligt Oracle SQL