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.