Como Encontrar ou Excluir Linhas Duplicadas em uma Tabela
Este é um erro mais comum do que imaginam, é comum nos deparamos com bases de dados repletas de registros duplicados, o que pode ter ocorrido por conta de um planejamento mal feito ou, forçado devido a importação de dados externos.
Neste post, veremos como localizar e remover os registros duplicados.
1- Criando uma Tabela de Testes
SQL> Create Table teste_duplicados (
id_produto number not null,
descricao varchar2(20),
Quantidade number not null) ;
Table created.
SQL>
2- Inserindo registro duplicados
SQL> Insert Into teste_duplicados Values (1, 'Manga A', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (2, 'Laranja B', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (3, 'Banana C', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (4, 'Laranja B', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (5, 'Banana C', 8);
1 row created.
SQL> Insert Into teste_duplicados Values (6, 'Kiwi D', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (7, 'UVA E', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (8, 'UVA E', 10);
1 row created.
SQL> Insert Into teste_duplicados Values (9, 'Maca F', 10);
1 row created.
SQL> commit;
Commit complete.
SQL>
2.1 – Checando as linhas da tabela
SQL> select * from teste_duplicados;
ID_PRODUTO DESCRICAO QUANTIDADE
---------- -------------------- ----------
1 Manga A 10
2 Laranja B 10
3 Banana C 10
4 Laranja B 10
5 Banana C 8
6 Kiwi D 10
7 UVA E 10
8 UVA E 10
9 Maca F 10
9 rows selected.
SQL>
3 – Identificando Linhas Duplicadas na Tabela
A instrução SELECT abaixo vai encontrar e exibir todas as linhas duplicadas em uma tabela, exceto a linha com o máximo ROWID. O exemplo a seguir utiliza a tabela teste_duplicados já criada acima:
SQL> SELECT * FROM teste_duplicados a
WHERE ROWID <> (SELECT MAX(ROWID)
FROM teste_duplicados b
WHERE a.descricao = b.descricao
);
ID_PRODUTO DESCRICAO QUANTIDADE
---------- -------------------- ----------
2 Laranja B 10
3 Banana C 10
7 UVA E 10
Após o select acima, identificamos que os produtos ‘Laranja B’, ‘UVA E’ e ‘Banana C’ estão duplicados.
4 – Excluindo Linhas Duplicadas na Tabela
Agora que já sabemos como identificar os registros, como excluí-los? A Instrução SQL abaixo excluirá todas as linhas duplicadas da tabela, exceto a linha com o ROWID máximo:
SQL> delete FROM teste_duplicados a
WHERE ROWID <> (SELECT MAX(ROWID)
FROM teste_duplicados b
WHERE a.descricao = b.descricao);
3 rows deleted.
SQL>
4.1 – Checando as linhas da tabela com os registros removidos
SQL> select * from teste_duplicados;
ID_PRODUTO DESCRICAO QUANTIDADE
---------- -------------------- ----------
1 Manga A 10
4 Laranja B 10
5 Banana C 8
6 Kiwi D 10
8 UVA E 10
9 Maca F 10
6 rows selected.
SQL>
Conclusão
O caminho mais rápido para acessar uma linha é usando a pseudocoluna ROWID. A coluna ROWID representa um número de identificação de armazenamento exclusivo para uma única linha em uma tabela (OBS: Duas linhas em tabelas diferentes, mas armazenados no mesmo cluster pode ter o mesmo valor rowid).
Antes de excluir os registros, é importante saber se eles não são chaves estrangeiras em outras tabelas, o que pode causar um grande estrago em seu banco de dados se o relacionamento foi criado com on delete cascade.