Følgende muligheder kan bruges til at slette dublerede rækker i Oracle Database.
Disse eksempler sletter duplikerede rækker, men beholder én. Så hvis der for eksempel er tre identiske rækker, sletter den to af dem og beholder en. Dette omtales ofte som de-duping af bordet.
Eksempeldata
Antag, at vi har en tabel med følgende 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, at de første to rækker er dubletter, ligesom de sidste tre rækker.
I dette tilfælde er alle kolonner dubletter. Der er ingen primær nøglekolonne. Normalt kan man forvente PetId
kolonne til at være en primær nøgle, men den indeholder duplikerede værdier og kan derfor ikke være en primær nøgle.
Hvis det var en primær nøgle, ville den indeholde unikke værdier på tværs af alle rækker, og der ville ikke være nogen dubletter.
Uanset hvad er der to muligheder for at finde og slette duplikerede rækker, selv når der ikke er en primær nøgle.
Valgmulighed 1
Her er en mulighed for at fjerne duplikerede rækker fra ovenstående tabel:
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 er nu blevet de-duperet. Tre rækker blev slettet, og fire er tilbage.
En af duplikatrækkerne for vores hund "Wag" er blevet slettet, og den anden er tilbage. To af dubletrækkerne for "Bark" er også blevet slettet.
Oracles rowid
pseudokolonne tillod os at udføre denne de-dupe-operation. Vi var i stand til at referere til det i vores forespørgsel for at bestemme, hvilke rækker der skulle slettes.
Sådan fungerer det, at hver række i en Oracle-database har en rowid
pseudokolonne, der returnerer adressen på rækken. rowid
er en unik identifikator for rækker i tabellen, og normalt identificerer dens værdi entydigt en række i databasen. Derfor kan vi identificere hver række, selv når vi ikke har en primær nøgle eller et andet unikt ID-felt.
Det er dog vigtigt at bemærke, at rækker i forskellige tabeller, der er gemt sammen i den samme klynge, kan have den samme rowid
.
Valgmulighed 2
Forudsat at tabellen er blevet gendannet med dens originale data (inklusive duplikerede rækker), er her en anden mulighed for at slette duplikerede rækker.
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
Samme resultat som det foregående eksempel.