SQLite
 sql >> Database >  >> RDS >> SQLite

2 modi per eliminare le righe duplicate in SQLite

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.