GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

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.

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *