Le seguenti opzioni possono essere utilizzate per eliminare le righe duplicate in SQLite.
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 chiave primaria. Il PetId
la colonna potrebbe sembrare come se potesse essere una chiave primaria, ma in realtà contiene valori duplicati. Pertanto, non è un identificatore univoco per ogni riga e non può essere utilizzato come chiave primaria.
Se esistesse una chiave primaria, conterrebbe valori univoci su tutte le righe e non ci sarebbero duplicati.
In ogni caso, di seguito sono riportate due opzioni per trovare ed eliminare le righe duplicate.
Opzione 1
Prima di deduplicare la tabella, possiamo utilizzare la seguente query per vedere quale/i riga/e verranno eliminate:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
Risultato:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Questo ci mostra che tre righe verranno eliminate quando deduppiamo la tabella nel passaggio successivo.
Per eliminare i valori duplicati, possiamo modificare la query precedente sostituendo SELECT *
con DELETE
:
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:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Il tavolo è stato ora deduplicato.
Come previsto, una delle righe duplicate per il nostro cane "Wag" è stata eliminata e l'altra rimane. Anche due delle righe duplicate per "Bark" sono state eliminate.
Il motivo per cui siamo stati in grado di farlo è a causa di rowid
di SQLite . Per impostazione predefinita, ogni riga in SQLite ha una colonna speciale, solitamente chiamata rowid
, che identifica in modo univoco quella riga all'interno della tabella. A meno che non sia stato esplicitamente rimosso dalla tabella, puoi usarlo come identificatore univoco per ogni riga, il che ci consente di costruire le query di cui sopra. Lo stesso vale per il prossimo esempio.
Opzione 2
Supponendo che la tabella sia stata ripristinata con i suoi dati originali (comprese le righe duplicate), ecco un'altra opzione per deduplicarla.
Verifica quali righe verranno eliminate:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Risultato:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Ora elimina quelle righe:
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
Il tavolo è stato deduplicato.