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.