sql >> Database >  >> RDS >> Oracle

2 manieren om dubbele rijen in Oracle te verwijderen

De volgende opties kunnen worden gebruikt om dubbele rijen in Oracle Database 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 sleutelkolom. Normaal gesproken zou je de PetId . kunnen verwachten kolom om een ​​primaire sleutel te zijn, maar het bevat dubbele waarden en kan daarom geen primaire sleutel zijn.

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

Hoe dan ook, hieronder zijn twee opties voor het vinden en verwijderen van dubbele rijen, zelfs als er geen primaire sleutel is.

Optie 1

Hier is een optie om dubbele rijen uit de bovenstaande tabel te verwijderen:

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:

3 row(s) deleted.

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

De tafel is nu ontdubbeld. Drie rijen zijn verwijderd en er zijn er nog vier over.

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

Oracle's rowid pseudocolumn stelde ons in staat om deze ontdubbelingsoperatie uit te voeren. We konden ernaar verwijzen in onze query om te bepalen welke rijen we moesten verwijderen.

Zoals dit werkt, heeft elke rij in een Oracle-database een rowid pseudokolom die het adres van de rij retourneert. De rowid is een unieke identificatie voor rijen in de tabel, en gewoonlijk identificeert de waarde ervan een unieke rij in de database. Daarom kunnen we elke rij identificeren, zelfs als we geen primaire sleutel of een ander uniek ID-veld hebben.

Het is echter belangrijk op te merken dat rijen in verschillende tabellen die samen in hetzelfde cluster zijn opgeslagen, dezelfde rowid kunnen hebben. .

Optie 2

Ervan uitgaande dat de tabel is hersteld met de oorspronkelijke gegevens (inclusief dubbele rijen), is hier een andere optie voor het verwijderen van dubbele 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

Hetzelfde resultaat als het vorige voorbeeld.


  1. MySQL 'user_id' in waar clausule dubbelzinnig probleem is

  2. MS Access-gegevens gebruiken in een samenvoegbewerking

  3. Hoe de sortering van een database in MySQL te tonen

  4. Oracle 12.2.0.1 komt in 2016