none
duplicatas em sql RRS feed

  • Pergunta

  • Olá galera, gente eu to com um problema

    o Sistema que eu elaborei esta duplicando uns codigos no sql e eu preciso esta apagando pois nao ta dando pra esta cadastrando na determinada tela do sistema. Criei um codigo pra copiar tudo que esta sendo duplicado no sql server

     

    select   
      id_produto,  
      count(id_produto) as id_associacao  
     from  
      tb_associacao_produto   
     group by id_produto  
     having count(id_produto) > 1 ;  

    eu preciso está apagando esses codigos que repetiu mas tenho que deixar um de cada 

    alguem pode me ajudar, nao sei mais o que fazer.

    sexta-feira, 19 de setembro de 2014 14:23

Respostas

  • Bom dia,

    Experimente dessa forma:

    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(PARTITION BY id_produto ORDER BY id_produto) as RN
        from tb_associacao_produto
    )
    
    delete from CTE_RN
    where RN > 1

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Tulio Rosa sexta-feira, 19 de setembro de 2014 14:42
    • Marcado como Resposta Ricardo Barbosa Cortes sexta-feira, 19 de setembro de 2014 17:24
    sexta-feira, 19 de setembro de 2014 14:37
  • Primeiro, qual é a chave primária da tabela tb_associacao_produto?

    Segundo, tenha certeza que se trata de um valor duplicado. Pelo nome da tabela eu diria que é normal (pelo menos é a impressao que passa, pois da ideia de uma table de ligaçao N para N, onde duplicaçoes sao normais)

    Se for mesmo um caso de duplicaçao e vc tenha uma chave primaria bem definida use este template:

    DELETE FROM table
    LEFT OUTER JOIN (
            SELECT MIN(id) as id, campo1, campo2, campo3
            FROM table
            GROUP BY campo1, campo2, campo3
        ) as t1 
        ON table.id = t1.id
    WHERE t1.id IS NULL

    desta forma somente os resgitros com a menor chave primaria restarao..

    Faça um bom backup [um bom backup é aquele que o restore funcione :) ] antes de fazer esse tipo de supressao

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 19 de setembro de 2014 14:39

Todas as Respostas

  • Bom dia,

    Experimente dessa forma:

    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(PARTITION BY id_produto ORDER BY id_produto) as RN
        from tb_associacao_produto
    )
    
    delete from CTE_RN
    where RN > 1

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta Tulio Rosa sexta-feira, 19 de setembro de 2014 14:42
    • Marcado como Resposta Ricardo Barbosa Cortes sexta-feira, 19 de setembro de 2014 17:24
    sexta-feira, 19 de setembro de 2014 14:37
  • Verônica,

    Todos os campos desses registros duplicados são iguais ?

    Tem algum campo no registro diferente ?


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote

    sexta-feira, 19 de setembro de 2014 14:38
  • Primeiro, qual é a chave primária da tabela tb_associacao_produto?

    Segundo, tenha certeza que se trata de um valor duplicado. Pelo nome da tabela eu diria que é normal (pelo menos é a impressao que passa, pois da ideia de uma table de ligaçao N para N, onde duplicaçoes sao normais)

    Se for mesmo um caso de duplicaçao e vc tenha uma chave primaria bem definida use este template:

    DELETE FROM table
    LEFT OUTER JOIN (
            SELECT MIN(id) as id, campo1, campo2, campo3
            FROM table
            GROUP BY campo1, campo2, campo3
        ) as t1 
        ON table.id = t1.id
    WHERE t1.id IS NULL

    desta forma somente os resgitros com a menor chave primaria restarao..

    Faça um bom backup [um bom backup é aquele que o restore funcione :) ] antes de fazer esse tipo de supressao

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 19 de setembro de 2014 14:39