none
Ajuda em um consulta ( retirar duplicados)

    Question

  • Boa tarde a todos;

     

    Na minha base de cadastro tenho infelizmente, usuário cadastrado mais de uma vez, quer "limpar" isso.

    Não posso confiar no CPF, antes quando era cadastrado não faziam validação, a unica coisa que tenho, seria o nome e a data de nascimento).

    Só fazendo esta busca, tive vários duplicados.

    como faço para deixar esses duplicados que encontrei somento uma vez, e que o codigo deles (o identity da tabela que prevalece seja o maior)?

    Ou seja, tenho:

    |  Maria Azevedo | 2006-21-09|  (5x na minha base) , quero que fique apenas 1x e este que ficar seja o que possui o codigo maior das 5 repetidas.

    segue minha consulta para achar as duplicadas, observe que nao consegui aqui colocar os codigos:

    SELECT count(data_nascimento) as qtd_data_nasc, count(nome_usuario) as qtd_nome, nome_usuario, data_nascimento

    FROM Usuarios Usu

    Inner Join dbo.Excluidos Exc On Usu.cod_Matricula = Exc.cod_Matricula

    Where cod_Motivo In (15,18)

    GROUP BY nome_usuario, data_nascimento

    HAVING count(nome_usuario) > 1

    ORDER BY nome_usuario

    --> resultado

    qtd_data_nasc qtd_nome nome_usuario data_nascimento

    ------------- ----------- ---------------------------------------------------------------------- -----------------------

    |2 | 2 |ANTONIO DE MELO |1935-11-26 00:00:00.000|

    |2 |2 |CARLA DAMASCENA| 1982-09-02 00:00:00.000|

    |2 |2 |CAROLINE DA SILVA |1983-02-12 00:00:00.000|

    Wednesday, October 04, 2006 6:36 PM

Answers

  • Olá Ygorabelo,

    Aqui vai um exemplo... Só é bom testar antes de rodar, hehe...

    -- Cria tabela temp
    DECLARE @temp TABLE (nome_usuario VARCHAR(100), data_nascimento DATETIME, n int)

    -- Insere dados
    INSERT INTO @temp (nome_usuario, data_nascimento, n)
    SELECT nome_usuario, data_nascimento, count(*)
    FROM Usuarios Usu
    INNER JOIN dbo.Excluidos Exc On Usu.cod_Matricula = Exc.cod_Matricula
    WHERE cod_Motivo In (15,18)
    GROUP BY nome_usuario, data_nascimento
    HAVING count(*) > 1
    ORDER BY nome_usuario

    -- Seleciona dados
    SELECT cod_Matricula, nome_usuario, data_nascimento
    FROM Usuarios Usu
    INNER JOIN @temp t on Usu.nome_usuario = t.nome_usuario and Usu.data_nascimento = t.data_nascimento
    WHERE cod_Matricula < (SELECT MAX(cod_Matricula) FROM Usuarios U WHERE Usu.nome_usuario = U.nome_usuario and Usu.data_nascimento = U.data_nascimento)

    -- Para apagar use este, vai apagar mesmos dados mostrados no SELECT acima
    DELETE FROM Usuarios Usu
    INNER JOIN @temp t on Usu.nome_usuario = t.nome_usuario and Usu.data_nascimento = t.data_nascimento
    WHERE cod_Matricula < (SELECT MAX(cod_Matricula) FROM Usuarios U WHERE Usu.nome_usuario = U.nome_usuario and Usu.data_nascimento = U.data_nascimento)

     

    Qualquer coisa retorne aqui.

    Abs.

    Wednesday, October 04, 2006 7:34 PM