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.