As opções a seguir podem ser usadas para excluir linhas duplicadas no SQLite.
Esses exemplos excluem linhas duplicadas, mas mantêm uma. Portanto, se houver três linhas idênticas, por exemplo, ele exclui duas delas e mantém uma. Isso geralmente é chamado de desduplicação da tabela.
Dados de amostra
Suponha que temos uma tabela com os seguintes dados:
SELECT * FROM Pets;
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Podemos ver que as duas primeiras linhas são duplicadas, assim como as três últimas linhas.
Nesse caso, todas as colunas são duplicadas. Não há chave primária. O
PetId
coluna pode parecer como se pudesse ser uma chave primária, mas na verdade contém valores duplicados. Portanto, não é um identificador exclusivo para cada linha e não pode ser usado como chave primária. Se houvesse uma chave primária, ela conteria valores exclusivos em todas as linhas e não haveria duplicatas.
De qualquer forma, abaixo estão duas opções para localizar e excluir linhas duplicadas.
Opção 1
Antes de desduplicar a tabela, podemos usar a seguinte consulta para ver quais linhas serão excluídas:
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
);
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Isso nos mostra que três linhas serão excluídas quando desduplicarmos a tabela na próxima etapa.
Para excluir os valores duplicados, podemos modificar a consulta acima substituindo
SELECT *
com 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;
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
A tabela agora foi desduplicada.
Como esperado, uma das linhas duplicadas para nosso cachorro “Wag” foi excluída e a outra permanece. Duas das linhas duplicadas para “Bark” também foram excluídas.
A razão pela qual conseguimos fazer isso é por causa do
rowid
do SQLite . Por padrão, cada linha no SQLite tem uma coluna especial, geralmente chamada de rowid
, que identifica exclusivamente essa linha na tabela. A menos que tenha sido explicitamente removido da tabela, você pode usar isso como um identificador exclusivo para cada linha, o que nos permite construir as consultas acima. O mesmo se aplica ao próximo exemplo. Opção 2
Supondo que a tabela tenha sido restaurada com seus dados originais (incluindo linhas duplicadas), aqui está outra opção para desduplicar.
Verifique quais linhas serão excluídas:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Agora exclua essas linhas:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Resultado:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
A mesa foi desduplicada.