Ir para conteúdo
Fórum Script Brasil
  • 0

Deletar registros duplicados


MatheusRomagna

Pergunta

Pessoal seguinte, estou com um pequeno problema. No meu banco de dados, duplicaram varias notas, tipo acho que mais de mil.

Estou usando esta SQL para saber quais numeros estão duplicados:

SELECT NUMERO, COUNT(*) FROM TABELA
GROUP BY 1
HAVING COUNT(*) > 1

Isto esta me trazendo todos os numeros que estão em duplicidade.

Preciso de uma forma de, deletar estes registros, seja por Stored Procedure ou alguma outra maneira mais rapida ao invés de "uma por uma".

Abraços.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Se estão duplicados então supõe-se que todos os atribustos destes registros estão em duplicidade, também.

Dito isto,

Faça backup antes de começas a fazer a sequencia que informarei abaixo.

1- crie uma tabela temporária com os mesmos campos da tabela com registros duplicados

2- insira dados na tabela temporária seguindo o script abaixo:

INSERT INTO TABELA_TEMPORARIA (relação de campos)
SELECT DISTINCT [coloque todos os campos da tabela aqui. Não use asterisco]
FROM TABELA
WHERE NUMERO IN (
   SELECT NUMERO FROM TABELA
   GROUP BY NUMERO
   HAVING COUNT(*) > 1
)
3 - delete os registros duplicados da tabela
DELETE FROM TABELA 
WHERE NUMERO IN (
   SELECT NUMERO FROM TABELA_TEMPORARIA)
)
4 - devolva os registros para tabela
INSERT INTO TABELA
SELECT * FROM TABELA_TEMPORARIA

5 - verifique e detone a tabela temporária

Link para o comentário
Compartilhar em outros sites

  • 0

Buenas Denis! Valeu Pela resposta rápida.

Seguinte, não posso mover as notas para uma tabela temporária, pois tenho uma ligação com FK na tabela de itens das notas.

Teria alguma outra maneira ?

Sobre o Codigo:

DELETE FROM TABELA 
WHERE NUMERO IN (
   SELECT NUMERO FROM TABELA_TEMPORARIA)
)

Acho que este código vai deletar um por um não diferenciando. Sei la, usando o FIRST 1 talvez não resolveria para um DELETE ? ( acho que esta clausula não pode ser usada em DELETE, mas sei la ). Se rodar ele , ele vai deletar todos da tabela que forem NUMERO = 1 , isso ?

Precisava de uma coisa mais rápida, uma Procedure talvez, que chamasse os duplicados pelo Select e deletasse apenas 1 de cada. ( Não sei se tem como fazer, pelo que eu acho )

Teria como Denis?

Abraço

Editado por MatheusRomagna
Link para o comentário
Compartilhar em outros sites

  • 0

'MatheusRomagna'

Eu te dei uma sequencia de ações baseadas em que o atributo NUMERO deva conter valor único.

Esta sequencia de ações passa por determinar e isolar dos duplicados somenste um registro de cada;

Eliminar TODOS os registros duplicado da tabela e retornar para a tabela os registros que voce isolou.

Se o atributo NUMERO não for único então esta sequencia está errada e dever-a ser pensada uma nova sequencia.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...