SQLite
 sql >> Base de données >  >> RDS >> SQLite

2 façons de supprimer les lignes en double dans SQLite

Les options suivantes peuvent être utilisées pour supprimer les lignes en double dans SQLite.

Ces exemples suppriment les lignes en double mais en conservent une. Donc s'il y a trois lignes identiques par exemple, il en supprime deux et en garde une. Ceci est souvent appelé déduplication de la table.

Exemple de données

Supposons que nous ayons un tableau avec les données suivantes :

SELECT * FROM Pets;

Résultat :

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

Nous pouvons voir que les deux premières lignes sont des doublons, tout comme les trois dernières lignes.

Dans ce cas, toutes les colonnes sont des doublons. Il n'y a pas de clé primaire. Le PetId la colonne peut regarder comme s'il s'agissait d'une clé primaire, mais elle contient en fait des valeurs en double. Par conséquent, ce n'est pas un identifiant unique pour chaque ligne et il ne peut pas être utilisé comme clé primaire.

S'il y avait une clé primaire, elle contiendrait des valeurs uniques sur toutes les lignes et il n'y aurait pas de doublons.

Dans tous les cas, vous trouverez ci-dessous deux options pour rechercher et supprimer les lignes en double.

Option 1

Avant de dédupliquer la table, nous pouvons utiliser la requête suivante pour voir quelle(s) ligne(s) seront supprimées :

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

Résultat :

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

Cela nous montre que trois lignes vont être supprimées lorsque nous déduplirons la table à l'étape suivante.

Pour supprimer les valeurs en double, nous pouvons modifier la requête ci-dessus en remplaçant SELECT * avec 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;

Résultat :

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

La table a maintenant été dédupliquée.

Comme prévu, l'une des lignes en double pour notre chien "Wag" a été supprimée et l'autre reste. Deux des lignes en double pour "Bark" ont également été supprimées.

La raison pour laquelle nous avons pu le faire est à cause du rowid de SQLite . Par défaut, chaque ligne dans SQLite a une colonne spéciale, généralement appelée rowid , qui identifie de manière unique cette ligne dans le tableau. À moins qu'il n'ait été explicitement supprimé de la table, vous pouvez l'utiliser comme identifiant unique pour chaque ligne, ce qui nous permet de construire les requêtes ci-dessus. La même chose s'applique à l'exemple suivant.

Option 2

En supposant que la table a été restaurée avec ses données d'origine (y compris les lignes en double), voici une autre option pour la déduplication.

Vérifiez quelles lignes seront supprimées :

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

Résultat :

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

Supprimez maintenant ces lignes :

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

SELECT * FROM Pets;

Résultat :

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

La table a été dédupliquée.