Usuário com melhor resposta
Exclusão de campo duplicado N pra N

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.
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
- Editado Logan Destefani Merazzi sexta-feira, 11 de janeiro de 2013 19:34
- Marcado como Resposta BorgoboyOficial sexta-feira, 11 de janeiro de 2013 19:54
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
-
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
- Editado Logan Destefani Merazzi sexta-feira, 11 de janeiro de 2013 19:34
- Marcado como Resposta BorgoboyOficial sexta-feira, 11 de janeiro de 2013 19:54
-
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