Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

2 maneiras de excluir linhas duplicadas no Oracle


As opções a seguir podem ser usadas para excluir linhas duplicadas no Oracle Database.

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á coluna de chave primária. Normalmente, pode-se esperar que o PetId coluna para ser uma chave primária, mas contém valores duplicados e, portanto, não pode ser uma chave primária.

Se fosse uma chave primária, ela conteria valores exclusivos em todas as linhas e não haveria duplicatas.

Independentemente disso, abaixo estão duas opções para localizar e excluir linhas duplicadas, mesmo quando não há chave primária.

Opção 1


Aqui está uma opção para remover linhas duplicadas da tabela acima:
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:
3 row(s) deleted.

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

A tabela agora foi desduplicada. Três linhas foram excluídas e quatro permanecem.

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.

rowid da Oracle pseudocoluna nos permitiu realizar essa operação de desduplicação. Conseguimos referenciá-lo em nossa consulta para determinar quais linhas excluir.

A maneira como isso funciona é que cada linha em um banco de dados Oracle tem um rowid pseudocoluna que retorna o endereço da linha. O rowid é um identificador exclusivo para linhas na tabela e, geralmente, seu valor identifica exclusivamente uma linha no banco de dados. Portanto, podemos identificar cada linha mesmo quando não temos uma chave primária ou algum outro campo de ID exclusivo.

No entanto, é importante observar que linhas em tabelas diferentes armazenadas juntas no mesmo cluster podem ter o mesmo rowid .

Opção 2


Supondo que a tabela tenha sido restaurada com seus dados originais (incluindo linhas duplicadas), aqui está outra opção para excluir linhas duplicadas.
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

Mesmo resultado do exemplo anterior.