Följande alternativ kan användas för att ta bort dubbletter av rader i Oracle Database.
Dessa exempel tar bort dubbletter av rader men behåller en. Så om det till exempel finns tre identiska rader, tar den bort två av dem och behåller en. Detta kallas ofta för att avdupa tabellen.
Exempeldata
Anta att vi har en tabell med följande data:
SELECT * FROM Pets;
Resultat:
PETID PETNAME PETTYPE 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Vi kan se att de två första raderna är dubbletter, liksom de tre sista raderna.
I det här fallet är alla kolumner dubbletter. Det finns ingen primärnyckelkolumn. Normalt kan man förvänta sig PetId
kolumn vara en primärnyckel, men den innehåller dubbletter av värden och kan därför inte vara en primärnyckel.
Om det var en primärnyckel skulle den innehålla unika värden över alla rader, och det skulle inte finnas några dubbletter.
Oavsett vilket, nedan finns två alternativ för att hitta och ta bort dubbletter av rader även när det inte finns någon primärnyckel.
Alternativ 1
Här är ett alternativ för att ta bort dubbletter av rader från tabellen ovan:
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;
Resultat:
3 row(s) deleted. PETID PETNAME PETTYPE 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Bordet har nu avduperats. Tre rader raderades och fyra finns kvar.
En av dubblettraderna för vår hund "Wag" har raderats och den andra finns kvar. Två av dubblettraderna för "Bark" har också tagits bort.
Oracles rowid
pseudokolumnen tillät oss att utföra denna de-dupe-operation. Vi kunde referera till det i vår fråga för att avgöra vilka rader som skulle raderas.
Så här fungerar det är att varje rad i en Oracle-databas har en rowid
pseudokolumn som returnerar adressen till raden. rowid
är en unik identifierare för rader i tabellen, och vanligtvis identifierar dess värde unikt en rad i databasen. Därför kan vi identifiera varje rad även när vi inte har en primärnyckel eller något annat unikt ID-fält.
Det är dock viktigt att notera att rader i olika tabeller som är lagrade tillsammans i samma kluster kan ha samma rowid
.
Alternativ 2
Förutsatt att tabellen har återställts med dess ursprungliga data (inklusive dubblettrader), här är ett annat alternativ för att ta bort dubblettrader.
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Resultat:
PETID PETNAME PETTYPE 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Samma resultat som föregående exempel.