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.