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

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

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.