none
deletar registro duplicado RRS feed

  • Pergunta

  • Boa tarde à todos.

    Pessoal eu recebe dados de um base excel, porem eu fiz alguns teste para saber se existe informações duplicadas.

    Ex.-- para saber se tem registro duplicados
    SELECT COUNT(codigo) FROM contrato
    GROUP BY codigo
    HAving count(codigo)>1

    R. ele me retornou vários codigos repetidos ex. 4 codigos repetidos ,depois mais 12 repetidos , ou seja, tem um codigo(23)que se repetiu 4 vezes, o codigo(31)que se repetiu 12 vezes, entre outros

    Gostaria de deletar esses codigos repetidos, e manter somente um de cada., porem não estou conseguindo, pois dessa maneira apaga tudo


    delete contrato
    where codigo in(
    SELECT COUNT(codigo) FROM contrato
    GROUP BY codigo
    HAving count(codigo)>1)

    abs. Wagner

    segunda-feira, 10 de julho de 2006 18:51

Respostas

  • Oi,

    O que eu quis dizer foi que vc cria uma nova tabela vazia (tabela2) com a mesma estrutura da tabela original.

    Quando fizer o comando INSERT:

    insert into tabela2
    select campo1, campo2, campo3
    from tabela1
    group by campo1, campo2, campo3
    go

    Os registros vão ser incluídos na tabela2, sem duplicidade. Então, vc deleta todos os registros da tabela1 e inclui os registros da tabela2:

    insert into tabela1
    select * from tabela2

    Espero ter ajudado

    • Sugerido como Resposta Vanderney Souza quarta-feira, 30 de março de 2011 17:45
    • Marcado como Resposta Eder Costa quinta-feira, 15 de setembro de 2011 12:28
    segunda-feira, 10 de julho de 2006 19:38
  • Bom dia,

    Outra dica...mais rápida em construção de código

    SELECT DISTINCT *
    INTO novaTabela
    FROM TabelaDuplicada

    Assim você já criaria uma table com mesma estrutura e dados distintos sem repetição...

    Dicas: Pode ainda fazer JOINs normalmente e colocar cláusulas como WHERE se necessário


    DBA Vini
    • Sugerido como Resposta Vinicius Allil quarta-feira, 31 de agosto de 2011 13:13
    • Editado Vinicius Allil quarta-feira, 31 de agosto de 2011 13:14 dicas
    • Marcado como Resposta Eder Costa quinta-feira, 15 de setembro de 2011 12:28
    quarta-feira, 31 de agosto de 2011 13:13

Todas as Respostas

  • toda a linha e igual ? ou so o codigo esta se repetindo ?
    segunda-feira, 10 de julho de 2006 19:06
  • Imagina o seguinte, alguém de manda uma base de dados, porem como vc vai ter certeza que esses registros não estão repetido, pois o usuario pode muito bem se encanar, com isso.

    dai que no select que eu fiz, ele me mostra a quantidade de vezes que cada cogido se repetiu, sem a necessidade, e por isso que tenho que deletar esses registros.

    E as linhas são todas iguais, ou seja, está repetindo mesmo.

    Abs. Wagner

    segunda-feira, 10 de julho de 2006 19:14
  • Wagner,

    Se a tabela não tiver muitos campos, vc pode fazer assim:

    Crie outra tabela vazia com a mesma estrutura.

    insert into tabela2
    select campo1, campo2, campo3
    from tabela1
    group by campo1, campo2, campo3
    go

    Entendeu ? É um jeito bem simples.

    Espero ter ajudado.

    segunda-feira, 10 de julho de 2006 19:19
  • Boa tarde José, dessa maneira que vc me passou ele vai é inserir mais registros, o que eu quero e deletar os registros duplicados..

    Ex. eu tinha 308 registros, dessa maneira ele acrescentou, mais 18 e foi pra 326, ou seja, ele incluiu os registrou repetidos.

    Mais de qualquer forma valeu.

    Abs.Wagner

    segunda-feira, 10 de julho de 2006 19:29
  • Olá Vagner...


    Segue os scripts:

    1.Select para localizar duplicados
        select campo,campo1,count(*)
         from tabela having count(*) > 1
        group by campo,campo1

    ----  2.Como deletar duplicados
       delete from tab p1
       where rowid < (select max(rowid)
                        from tab1 p2
                       where p1.primary_key = p2.primary_key)

     

    Mas antes de fazer essa alteração, faça um backup para segurança...

    Abços,
    Rita

    segunda-feira, 10 de julho de 2006 19:37
  • Oi,

    O que eu quis dizer foi que vc cria uma nova tabela vazia (tabela2) com a mesma estrutura da tabela original.

    Quando fizer o comando INSERT:

    insert into tabela2
    select campo1, campo2, campo3
    from tabela1
    group by campo1, campo2, campo3
    go

    Os registros vão ser incluídos na tabela2, sem duplicidade. Então, vc deleta todos os registros da tabela1 e inclui os registros da tabela2:

    insert into tabela1
    select * from tabela2

    Espero ter ajudado

    • Sugerido como Resposta Vanderney Souza quarta-feira, 30 de março de 2011 17:45
    • Marcado como Resposta Eder Costa quinta-feira, 15 de setembro de 2011 12:28
    segunda-feira, 10 de julho de 2006 19:38
  • Wagner,

    Na verdade você pode inserir em outra tabela (contrato2) o numero de registros sem estar repetindo tipo assim:

    SELECT     COUNT(codigo) AS total
    INTO            contrato2
    FROM         contrato
    GROUP BY codigo
    HAVING      (COUNT(codigo) > 1)

    Assim dessa forma tera uma tabela sem os valores repeditos.

    Teste e retorne caso tenha duvida.

     

    • Sugerido como Resposta Vanderney Souza quarta-feira, 30 de março de 2011 17:45
    segunda-feira, 10 de julho de 2006 19:39
  • Pô cara funcionou, eu não tinha prestado atenção antes que vc pediu para criar uma tabela temporária.

    Valeu mesmo ..rs.r.s.r.s

    Abs.Wagner

    segunda-feira, 10 de julho de 2006 19:43
  • Vagner,

    Tem um script e nem precisa criar tabela temporária...E fica mais simples..

     Segue os scripts:

    1.Select para localizar duplicados
        select campo,campo1,count(*)
         from tabela having count(*) > 1
        group by campo,campo1

    ----  2.Como deletar duplicados
       delete from tab p1
       where rowid < (select max(rowid)
                        from tab1 p2
                       where p1.primary_key = p2.primary_key)

     

    Mas antes de fazer essa alteração, faça um backup para segurança...

    Abços,

     

    segunda-feira, 10 de julho de 2006 19:46
  • Para SQL 2005 e 2008 não há necessidade de Criar tabela temporaria, isso é somente no 2000

     

    Segue exemplo para 2005 e 2008 remove os duplicados e deixar 1.

    exemplo se tiver 3 duplicados remove 2 e deixa 1.

    -----------CRIA TABELA

    CREATE TABLE Comunidade

    (

    Id int IDENTITY,

    Nome varchar(100),

    URL varchar(100),

    Cadastro Datetime default getdate()

    )

    ------------INSERINDO CAMPOS alguns com DUPLICIDADE

    INSERT INTO Comunidade

    (Nome, URL)

    VALUES

    ('ROdotNET', 'http://www.rodotnet.com.br/'),

    ('ROdotNET', 'http://www.rodotnet.com.br/'),

    ('ROdotNET', 'http://www.rodotnet.com.br/'),

    ('DEV GOIAS', 'http://www.devgoias.net/'),

    ('CODE 4 ALL', 'http://code4all.ning.com/'),

    ('Azure Services BR', 'http://azureservicesbr.ning.com/'),

    ('WCF Brasil', 'http://wcfbrasil.ning.com'),

    ('CEARA.NET', 'http://www.cearadotnet.net/'),

    ('DEVBLU', 'http://www.devblu.net'),

    ('DEVBLU', 'http://www.devblu.net'),

    ('DEVBLU', 'http://www.devblu.net')

    ------------------SELECT PARA VER TODOS

    SELECT * FROM Comunidade

    ------------------AGORA REMOVE SOMENTE DUPLICADOS sql 2005/2008

    DELETE FROM tabela 

    FROM

    (

    SELECT

    Nome, URL, Cadastro, ROW_NUMBER() OVER (partition by Nome, URL order by Nome) Ocorrencias

    FROM

    Comunidade) tabela

    WHERE tabela.Ocorrencias > 1

    ----------------------SELEC NOVAMENTE PARA VER QUE FUNFA

    SELECT * FROM Comunidade

    • Sugerido como Resposta Eder Costa quinta-feira, 15 de setembro de 2011 12:30
    quarta-feira, 31 de agosto de 2011 01:18
  • Bom dia,

    Outra dica...mais rápida em construção de código

    SELECT DISTINCT *
    INTO novaTabela
    FROM TabelaDuplicada

    Assim você já criaria uma table com mesma estrutura e dados distintos sem repetição...

    Dicas: Pode ainda fazer JOINs normalmente e colocar cláusulas como WHERE se necessário


    DBA Vini
    • Sugerido como Resposta Vinicius Allil quarta-feira, 31 de agosto de 2011 13:13
    • Editado Vinicius Allil quarta-feira, 31 de agosto de 2011 13:14 dicas
    • Marcado como Resposta Eder Costa quinta-feira, 15 de setembro de 2011 12:28
    quarta-feira, 31 de agosto de 2011 13:13
  • Bom dia,

    Outra dica...mais rápida em construção de código

    SELECT DISTINCT *
    INTO novaTabela
    FROM TabelaDuplicada

    Assim você já criaria uma table com mesma estrutura e dados distintos sem repetição...

    Dicas: Pode ainda fazer JOINs normalmente e colocar cláusulas como WHERE se necessário


    DBA Vini
    Muito bom este eim!!!
    • Sugerido como Resposta Vinicius Allil quarta-feira, 31 de agosto de 2011 20:26
    quarta-feira, 31 de agosto de 2011 19:17
  • Wagner, mais fácil seria (se receber de alguém), solicitar que te envie os dados sem as duplicidades. Se a pessoa que te envia puder fazer o tratamento na aplicação dela, os registros sempre chegarão prontos a você.
    []´s Obrigado, Denison Soares
    quinta-feira, 1 de setembro de 2011 18:35
  • Isso vai resolver para ele apenas os dados futuros, o que já está escrito no banco, continua aguardando tratamento.
    Não creio que seja uma boa opção.
    DBA Vini
    quinta-feira, 1 de setembro de 2011 19:18
  • Prezados, sou novo aqui mas estava com o mesmo problema e escrevi um script. Depois eu vi que a solução do Sr. Renan Kemp funciona bem! Mas de qualquer forma vou postar aqui! Caso haja mais do que 2 registros o script tem de ser rodado mais de uma vez.
    --CODIGO É O CAMPO PK DA TABELA
    DELETE tabela WHERE CODIGO IN
    (
    SELECT MAX(CODIGO) AS CODIGO
    FROM
    (
    SELECT CODIGO,COLUNA1, COLUNA2
    FROM TABELA
    where CAMPO_DUPLICADO IN (
      SELECT CAMPO_DUPLICADO
      FROM TABELA
      WHERE COLUNA_FILTRO = 'X'
      GROUP BY CAMPO_DUPLICADO
      HAVING COUNT(*)>1
      
      )
    AND COLUNA_FILTRO = 'X'

    ) AS TBL
    GROUP BY CAMPO_DUPLICADO
    )
    terça-feira, 27 de setembro de 2011 23:34
  • Funcionou perfeitamente, valeu, show de bola!

    Parabéns!

    terça-feira, 1 de outubro de 2013 17:57