none
Deletar Duplicados RRS feed

  • Pergunta

  •  

    Boa tarde pessoal,

     

    Possuo uma tabela que tem dados duplicados!

     

    Gostaria de saber como deixar apenas um unico registro e deletar o restante desses duplicados?

     

     

    []'s

    Bruno

    segunda-feira, 14 de abril de 2008 19:44

Respostas

  • Boa Tarde,

     

    Não existe uma forma 100% ótima para tratar registros duplicados. Isso dependerá se a tabela possui relacionamentos com outra tabela, os critérios para desempate, ou seja, o que torna os registros diferentes, etc. A abordagem mais básica consiste em colocar os registros em uma tabela temporária, apagar os registros da primeira tabela e posteriormente fazer uma carga. Ex:

     

    SELECT DISTINCT * INTO #tblTemp FROM Tabela

    DELETE FROM Tabela

    INSERT INTO Tabela SELECT * FROM #tblTemp

    DROP TABLE #tblTemp

     

    Podemos colocar soluções mais elaboradas se você detalhar um pouco mais sua situação. Qual seria o SQL ?

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 14 de abril de 2008 20:03

Todas as Respostas

  • Boa Tarde,

     

    Não existe uma forma 100% ótima para tratar registros duplicados. Isso dependerá se a tabela possui relacionamentos com outra tabela, os critérios para desempate, ou seja, o que torna os registros diferentes, etc. A abordagem mais básica consiste em colocar os registros em uma tabela temporária, apagar os registros da primeira tabela e posteriormente fazer uma carga. Ex:

     

    SELECT DISTINCT * INTO #tblTemp FROM Tabela

    DELETE FROM Tabela

    INSERT INTO Tabela SELECT * FROM #tblTemp

    DROP TABLE #tblTemp

     

    Podemos colocar soluções mais elaboradas se você detalhar um pouco mais sua situação. Qual seria o SQL ?

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 14 de abril de 2008 20:03
  • Primeiro passo é agrupar os registros duplicados.

    realizar um loop nesses registros

    fazer um critério para distinguir as informações e

    apagar o necessário

     

    segunda-feira, 14 de abril de 2008 20:04
  •  

    Obrigado Gustavo,

     

    Não havia pensado em uma tabela temporaria, imaginei que o SQL trata-se isso de alguma forma.

     

    Utilizo o SQL 2000 e possuo uma tabela de clientes.

    CPF, Nome.

     

    E o critério para duplicado é o CPF.

     

    Se tiverem outras dicas, ficarei grato.
    segunda-feira, 14 de abril de 2008 20:11
  • Olá Bruno,

     

    No caso, além do critério para duplicação é preciso um critério de desempate. Se houver dois CPFs iguais mas com nomes diferentes qual dos dois deve ficar ? O primeiro ? O último ? Qualquer um ?

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 14 de abril de 2008 20:19
  •  

    Gustavo,

     

    Nesse caso qualquer um, pois na base não tenho como ver qual deles é o mais recente.

    segunda-feira, 14 de abril de 2008 20:23
  • Bruno,

     

    o que o Gustavo está dizendo é para analisar os registros, qual é o correto ?

    por algum motivo ocorreu a duplicação, provavelmente um é  mais correto que o outro.

     

     

     

    segunda-feira, 14 de abril de 2008 20:26
  • Olá Bruno,

     

    Exatamente como o Macul disse. Se ocorreu duplicação, algum é mais "certo" que outro. Na verdade alguma coisa deve diferenciar os registros. Pode haver o mesmo CPF, mas às vezes o nome é diferente, a data de cadastro, o código, enfim, algum campo deve diferenciar os registros. Esse critério de desempate é conhecido como Tiebreaker. No meu exemplo usei o código como Tiebreaker.

     

    Code Snippet

    CREATE TABLE clientes (

    Codigo INT Identity(1,1),

    Nome VARCHAR(20),

    CPF CHAR(11))

     

    INSERT INTO clientes (Nome, CPF) VALUES ('Ze da Silva','11122233344')

    INSERT INTO clientes (Nome, CPF) VALUES ('Joao da Silva','11122233344')

    INSERT INTO clientes (Nome, CPF) VALUES ('Antonieta','77788899900')

    INSERT INTO clientes (Nome, CPF) VALUES ('Amanda','77788899900')

     

    -- Excluir registros duplicados com base no menor código

    BEGIN TRAN

    DELETE FROM clientes

    WHERE NOT EXISTS

    (

    SELECT MenorCodigo, CPF FROM

    (SELECT MIN(Codigo) As MenorCodigo, CPF FROM Clientes GROUP BY CPF) AS Sobreviventes

    WHERE Sobreviventes.MenorCodigo = clientes.Codigo AND Sobreviventes.CPF = clientes.CPF)

     

    SELECT Codigo, Nome, CPF FROM clientes

     

    ROLLBACK

     

     

    Eu poderia ter elegido como tiebreaker o menor nome de forma a sobrar apenas os registros Joao da Silva e Amanda. O tiebreaker também poderia ter sido aleatório.

     

    [ ]s,

     

    Gustavo

    segunda-feira, 14 de abril de 2008 20:39