SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

2 maneiras de excluir linhas duplicadas no SQLite


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.