Les options suivantes peuvent être utilisées pour supprimer les lignes en double dans Oracle Database.
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 colonne de clé primaire. Normalement, on pourrait s'attendre à ce que le PetId
colonne comme clé primaire, mais elle contient des valeurs en double et ne peut donc pas être une clé primaire.
S'il s'agissait d'une clé primaire, elle contiendrait des valeurs uniques sur toutes les lignes et il n'y aurait pas de doublons.
Quoi qu'il en soit, vous trouverez ci-dessous deux options pour rechercher et supprimer des lignes en double, même en l'absence de clé primaire.
Option 1
Voici une option pour supprimer les lignes en double du tableau ci-dessus :
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 :
3 row(s) deleted. PETID PETNAME PETTYPE 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
La table a maintenant été dédoublée. Trois lignes ont été supprimées et quatre restent.
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.
rowid
d'Oracle pseudocolumn nous a permis d'effectuer cette opération de déduplication. Nous avons pu le référencer dans notre requête pour déterminer quelles lignes supprimer.
La façon dont cela fonctionne est que chaque ligne d'une base de données Oracle a un rowid
pseudo-colonne qui renvoie l'adresse de la ligne. Le rowid
est un identifiant unique pour les lignes de la table, et généralement sa valeur identifie de manière unique une ligne dans la base de données. Par conséquent, nous pouvons identifier chaque ligne même si nous n'avons pas de clé primaire ou d'autre champ d'identification unique.
Cependant, il est important de noter que les lignes de différentes tables qui sont stockées ensemble dans le même cluster peuvent avoir le même rowid
.
Option 2
En supposant que le tableau a été restauré avec ses données d'origine (y compris les lignes en double), voici une autre option pour supprimer les lignes en double.
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
Même résultat que l'exemple précédent.