sql >> Database teknologi >  >> RDS >> Oracle

2 måder at slette duplikerede rækker i Oracle

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.


  1. Oracle Konverter TIMESTAMP med Timezone til DATE

  2. Kan ikke oprette forbindelse til databaseserver (mysql workbench)

  3. Datamodellen for vigtige datoer

  4. onCreate() af RoomDatabase.Callback() blev ikke kaldt efter et vellykket kald til .build()