none
Exclusão de campo duplicado N pra N RRS feed

  • Pergunta

  • Senhores,

    Boa Tarde!

    Preciso excluir registros de uma tabela do banco de dados sql server 2008, parece simples não? Porem esses registros estão em uma tabela N para N com alguns milhões de registros.

    ID CHAVE1 CHAVE2

    1 1 2

    2 1 3

    3 1 4

    4 1 2   (Essa linha preciso remover pois ja tenho um registro igual, o registro com id=1)

    Alguem pode me ajudar a montar a query?

    Ja tentei de varias formas mas ainda não consegui.

    sexta-feira, 11 de janeiro de 2013 18:21

Respostas

  • BorgoboyOficial:

    Bom, acredito que você precise manter qualquer uma das ocorrências existentes, então vou excluir todas, menos a primeira inserida...

    CREATE TABLE TESTE (cod int primary key identity (1,1), cd_tb1 int, cd_tb2 int)
    go
    insert into teste values (1,1),(1,2),(1,3),(1,4),(1,1)
    go 5 -- insere 5 vezes as linhas acima, criando uma série de repetições
    SELECT * From Teste
    GO
    ;with cte_teste
    as
    (
      select cd_tb1, cd_tb2, ROW_NUMBER() OVER (Partition by cd_tb1, cd_tb2 ORDER BY cod) as Seq
      from teste
    )
    delete from cte_teste -- apesar de estar deletando da CTE_Teste, os registros serão excluída da tabela TESTE
    where seq > 1 -- Mantenho apenas a primeira ocorrencia inserida na tabela Teste
    GO
    SELECT * From Teste
    GO
    DROP TABLE Teste

    Sugiro, depois de realizado o procedimento, criar uma Unique Key na tabela com as 2 colunas, para que novas repetições sejam bloqueadas.

    Espero ter ajudado.

    []'s



    sexta-feira, 11 de janeiro de 2013 19:24

Todas as Respostas

  • Cara,

    Primeiro que para deletar o registro informado acima, você vai precisar deletar a referência entre as tabelas.

    Mas posta o seu código que tentou executar e os nomes das tabelas duas tabelas, e se conseguir pegar o nome da referência criado pelo SQL.


    Atenciosamente, Samuel dos Anjos

    sexta-feira, 11 de janeiro de 2013 18:26
  • BorgoboyOficial:

    Bom, acredito que você precise manter qualquer uma das ocorrências existentes, então vou excluir todas, menos a primeira inserida...

    CREATE TABLE TESTE (cod int primary key identity (1,1), cd_tb1 int, cd_tb2 int)
    go
    insert into teste values (1,1),(1,2),(1,3),(1,4),(1,1)
    go 5 -- insere 5 vezes as linhas acima, criando uma série de repetições
    SELECT * From Teste
    GO
    ;with cte_teste
    as
    (
      select cd_tb1, cd_tb2, ROW_NUMBER() OVER (Partition by cd_tb1, cd_tb2 ORDER BY cod) as Seq
      from teste
    )
    delete from cte_teste -- apesar de estar deletando da CTE_Teste, os registros serão excluída da tabela TESTE
    where seq > 1 -- Mantenho apenas a primeira ocorrencia inserida na tabela Teste
    GO
    SELECT * From Teste
    GO
    DROP TABLE Teste

    Sugiro, depois de realizado o procedimento, criar uma Unique Key na tabela com as 2 colunas, para que novas repetições sejam bloqueadas.

    Espero ter ajudado.

    []'s



    sexta-feira, 11 de janeiro de 2013 19:24
  • BorgoboyOficial:

    Bom, acredito que você precise manter qualquer uma das ocorrências existentes, então vou excluir todas, menos a primeira inserida...

    CREATE TABLE TESTE (cod int primary key identity (1,1), cd_tb1 int, cd_tb2 int)
    go
    insert into teste values (1,1),(1,2),(1,3),(1,4),(1,1)
    go 5 -- insere 5 vezes as linhas acima, criando uma série de repetições
    SELECT * From Teste
    GO
    ;with cte_teste
    as
    (
      select cd_tb1, cd_tb2, ROW_NUMBER() OVER (Partition by cd_tb1, cd_tb2 ORDER BY cod) as Seq
      from teste
    )
    delete from cte_teste -- apesar de estar deletando da CTE_Teste, os registros serão excluída da tabela TESTE
    where seq > 1 -- Mantenho apenas a primeira ocorrencia inserida na tabela Teste
    GO
    SELECT * From Teste
    GO
    DROP TABLE Teste

    Sugiro, depois de realizado o procedimento, criar uma Unique Key na tabela com as 2 colunas, para que novas repetições sejam bloqueadas.

    Espero ter ajudado.

    []'s



    Obrigado meu caro
    sexta-feira, 11 de janeiro de 2013 19:55