Remover Registros Duplicados no Oracle Com ROWID

By | maio 28, 2010

Se você usa o banco de dados Oracle sabe que tem o melhor produto do mercado. Muitos sites usam o MySQL pelo preço e recursos básicos, mas se for para o lado corporativo onde o bicho pega, Oracle é a solução. O banco de dados deste site é o MySQL, veja como instalar o WordPress no Mac OS X ou como Otimizar e Melhorar o MySQL Com WordPress.

O Oracle é o banco mais seguro e com mais recursos que conheço, um exemplo disso é a simples tarefa, não tão simples em outros bancos, de eliminar registros duplicados. Vejamos:

oracle logo

Por exemplo temos a tabela EMPREGADOS com os registros duplicados:

select nome,matricula from empregados where nome='ANTONIO';

Nome Matricula
------- ---------
ANTONIO 1234567
ANTONIO 1234567

Se fosse apenas o problema o ANTONIO, bastava remover os dois e reinserir apenas um. Como fazer se você tem muitos outros registros na mesma situação, as vezes milhares ou milhões?

No caso de milhões de registros duplicados, sabendo como apaga-los recomendo:

1. Desativar os índices para apagar para agilizar o processo.

2. Ao invés de apagar os registros duplicados, criar uma nova tabela com os registros certos. Em alguns casos onde existem milhões de duplicados, este é o melhor caminho.

Mas voltando ao caso do ANTONIO, como vamos apagar de forma segura muitos registros semelhantes que estão duplicados?

O Oracle contém uma pseudo coluna chamada ROWID, uma chava primária única criada para cada registro inserido no banco. Você pode viusalizar esta coluna assim:

select rowid, nome, matricula from empregados;

Rowid Nome Matricula
------ ------- ----------
aaawdwddw ANTONIO 1234567
bbookwoee ANTONIO 1234567

para pegar apenas um destes registros selecionamos através do min(rowid):

select min(rowid) from empregados group by nome,matricula;

E por fim, para eliminar estes registros usamos o seguinte comando:

delete from empregados where rowid not in
(select min(rowid) from empregados group by nome,matricula);

Sem categoria

Deixe uma resposta

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