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

2 modi per eliminare le righe duplicate in Oracle

Le seguenti opzioni possono essere utilizzate per eliminare le righe duplicate in Oracle Database.

Questi esempi eliminano le righe duplicate ma ne conservano una. Quindi, se ci sono tre righe identiche, ad esempio, ne cancella due e ne conserva una. Questo è spesso indicato come de-duping della tabella.

Dati campione

Supponiamo di avere una tabella con i seguenti dati:

SELECT * FROM Pets;

Risultato:

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

Possiamo vedere che le prime due righe sono duplicate, così come le ultime tre righe.

In questo caso, tutte le colonne sono duplicate. Non esiste una colonna chiave primaria. Normalmente, ci si potrebbe aspettare il PetId colonna come chiave primaria, ma contiene valori duplicati e pertanto non può essere una chiave primaria.

Se fosse una chiave primaria, conterrebbe valori univoci su tutte le righe e non ci sarebbero duplicati.

Indipendentemente da ciò, di seguito sono riportate due opzioni per trovare ed eliminare le righe duplicate anche quando non esiste una chiave primaria.

Opzione 1

Ecco un'opzione per rimuovere le righe duplicate dalla tabella sopra:

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;

Risultato:

3 row(s) deleted.

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

Il tavolo è stato ora deduplicato. Tre righe sono state eliminate e quattro rimangono.

Una delle righe duplicate per il nostro cane "Wag" è stata cancellata e l'altra rimane. Anche due delle righe duplicate per "Bark" sono state eliminate.

rowid di Oracle pseudocolonna ci ha permesso di eseguire questa operazione di deduplicazione. Siamo stati in grado di fare riferimento ad esso nella nostra query per determinare quali righe eliminare.

Il modo in cui funziona è che ogni riga in un database Oracle ha un rowid pseudocolonna che restituisce l'indirizzo della riga. Il rowid è un identificatore univoco per le righe nella tabella e in genere il suo valore identifica in modo univoco una riga nel database. Pertanto, possiamo identificare ogni riga anche quando non abbiamo una chiave primaria o qualche altro campo ID univoco.

Tuttavia, è importante notare che le righe di tabelle diverse archiviate insieme nello stesso cluster possono avere lo stesso rowid .

Opzione 2

Supponendo che la tabella sia stata ripristinata con i suoi dati originali (comprese le righe duplicate), ecco un'altra opzione per eliminare le righe duplicate.

DELETE FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

SELECT * FROM Pets;

Risultato:

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

Stesso risultato dell'esempio precedente.