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
|
20/05/2008 em 07:52 AM
Interessante…
08/08/2008 em 04:50 PM
Tem um modo mais fácil, sem ter que criar várias tabelas, ou seja, usando apenas a tabela existente.
11/08/2008 em 07:31 AM
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.