Read in english (Automatic translate wiht Google)

Script é destinado a necessidades de eliminar registros duplicados dos quais a chave primária não é igual.

Para o nosso exemplo vamos utilizar uma tabela de backup TABELA_BKP com os campos “Codigo” como chave primária, “Codigo1” uma chave estrangeira e “Codigo2” outra chave do qual estão duplicados e não deveriam, o atributo ativo defino os registros que estão ativos neste caso.

Este script pode ser rodado por partes. Caso você for fazer isso roda um passo inteiro de cada vez.

Caso você queira saber se existem registros duplicados em uma tabela basta executar o seguinte SQL (Altere de acordo com a sua tabela):

1
2
3
4
5
6
7
8
9
10

Select 
      Codigo1, Codigo2 
FROM 
      TABELA 
GROUP BY 
      Codigo1, Codigo2 
HAVING 
      COUNT ( * )  >  1
 
Para remover os registros duplicados siga os passos abaixo.

1) Primeiro devemos criar esta tabela de backup e inserir todos os registros nela.

— —Tabela de Backup – Início

1
2
3
4
5
6
7
8

CREATE TABLE  TABELA_BKP
(
       Codigo int PRIMARY KEY,
       Codigo1 int,
       Codigo2 int,
       Ativo char(1) 
)
— —Realiza o backup —
1
2
3
4
5
6

INSERT INTO TABELA_BKP
select 
       Codigo, Codigo1, Codigo2, Ativo
FROM 
       TABELA_ORIGINAL 

— —Tabela de Backup – Fim

2) Devemos criar duas outras tabelas onde a primeira irá armazenar os registros que serão considerados os únicos e na outra a identificação dos registros duplicados, que no caso são o Codigo1 e Codigo2 que não devem repetir. Na tabela REGISTROS_UNICOS devemos criar o campo Codigo que é o identificador de cada registro, na tabela REGISTROS_DUPLICADOS não devemos.

— —Tabela Temporária de registros únicos —
1
2
3
4
5
6
7

CREATE TABLE REGISTROS_UNICOS
(
       Codigo int PRIMARY KEY,
       Codigo1 int,
       Codigo2 int 
)
— —Tabela Temporária de registros duplicados —
1
2
3
4
5
6
7

CREATE TABLE REGISTROS_DUPLICADOS
(
       Codigo1 int,
       Codigo2 int
)
 
3) Agora devemos pegar apenas as tuplas que possuem os registros duplicados. — —Pega as linhas com registros duplicados – Início —
1
2
3
4
5
6
7
8
9
10

INSERT INTO REGISTROS_DUPLICADOS
SELECT
       Codigo1, Codigo2
FROM 
       TABELA_ORIGINAL
GROUP BY 
       Codigo1, Codigo2
HAVING
       COUNT ( * )  > 1
— —Pega as linhas com registros duplicados – Fim —

4) Agora devemos buscar uma tupla de cada registros duplicado, da qual está tupla será a que considerarmos como o registro único. Para isso utilizaremos um curso que busca da tabela de registros duplicados que já preenchemos.

— —Pega uma linha de cada um dos registros dupplicados – Início —
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

DECLARE TodosRegistrosDuplicados CURSOR
       KEYSET
       FOR 
       SELECT
              Codigo1, Codigo2
       FROM
              REGISTROS_DUPLICADOS
GO

OPEN TodospalpitesDuplicados

DECLARE @Codigo1 INTEGER

DECLARE @Codigo2 INTEGER

FETCH FIRST FROM TodosRegistrosDuplicados INTO @Codigo1, @Codigo2

WHILE @@FETCH_STATUS = 0
BEGIN
Neste Momento estamos buscando um registro dos duplicados para se o único de cada um dos duplicados e utilizamos o seu identificador único Codigo que será utilizado futuramente. — —Buscamos o registro que será o único —
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

insert into REGISTROS_UNICOS

select TOP 1
       Codigo, Codigo1, Codigo2
from
       TABELA_ORIGINAL
where
       Codigo1 = @Codigo1
       AND Codigo2= @Codigo2

       FETCH NEXT FROM TodosRegistrosDuplicados INTO @Codigo1, @Codigo2

END

CLOSE TodosRegistrosDuplicados 

DEALLOCATE TodosRegistrosDuplicados
— —Pega uma linha de cada um dos registros dupplicados – Fim —

5) Esta consulta apenas nos mostra se há registros duplicados em nossa nova tabela. Caso não haja retorno desta consulta você pode pular direto para o passo 8 onde você apaga as tabelas temporárias pois não há registros duplicados.

— —Verifica se existe registros duplicados – Início —
1
2
3
4
5

SELECT
       Codigo1, Codigo2
FROM
       REGISTROS_DUPLICADOS
— —Verifica se existe registros duplicados – Fim —

6) Este passo atualiza os registros duplicados de menos o registro que consideramos como único.

— —Atualiza os registros duplicados —
1
2
3
4
5
6
7
8
9
10
11
12

UPDATE 
       TABELA_ORIGINAL
SET
       TABELA_ORIGINAL.ATIVO = 'N'
FROM
       TABELA_ORIGINAL, REGISTROS_UNICOS
WHERE
       TABELA_ORIGINAL.Codigo1 = REGISTROS_UNICOS.Codigo1
       AND TABELA_ORIGINAL.Codigo2 = REGISTROS_UNICOS.Codigo2
       AND TABELA_ORIGINAL.Codigo <> REGISTROS_UNICOS.Codigo
 
7) Este passo atualiza os registros que buscamos no passo 4 e consideramos como os registros únicos. — —Atualiza o único registro —
1
2
3
4
5
6
7
8
9
10
11
12

UPDATE
       TABELA_ORIGINAL
SET
       TABELA_ORIGINAL.ATIVO = 'S'
FROM
       TABELA_ORIGINAL, REGISTROS_UNICOS
WHERE
       TABELA_ORIGINAL.Codigo1 = REGISTROS_UNICOS.Codigo1
       AND TABELA_ORIGINAL.Codigo2 = REGISTROS_UNICOS.Codigo2
       AND TABELA_ORIGINAL.Codigo = REGISTROS_UNICOS.Codigo
 

8) Este passo apaga as tabelas utilizadas como temporárias.

— —Apaga Tabelas Temporárias —
1
2
3
4
   
DROP TABLE REGISTROS_UNICOS

DROP TABLE REGISTROS_DUPLICADOS

3 Comentários to “Remoção de tuplas duplicadas”

  1. Rejane Ayres diz:

    Interessante…

  2. Renato diz:

    Tem um modo mais fácil, sem ter que criar várias tabelas, ou seja, usando apenas a tabela existente.

  3. Samuel diz:

    Renato, se há uma maneira mais facil crie um post aqui com ela, pois você pode ajudar outros que venham a ter este problema.

    Eu também não sei fazer de outra forma, estou curioso.

Deixe um comentário

If you can read this, you don't use a typical webbrowser that plays nice with CSS.
Please do not fill in anything here!