Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rodnois

Deletar Registros Duplicados

Recommended Posts

Olá moçada tenho o seguinte sql

 

SELECT idcobranca, autorizacao
FROM dadoscobranca
Where autorizacao IN (SELECT associados.autorizacao
FROM dadoscobranca INNER JOIN associados ON dadoscobranca.autorizacao = associados.autorizacao
WHERE (associados.idativo = 1) AND (dadoscobranca.cdinstituicaocobranca = 9) AND (dadoscobranca.idativo = 1)
GROUP BY associados.Autorizacao
HAVING COUNT (associados.Autorizacao)>1) AND cdinstituicaocobranca = 9
GROUP BY autorizacao, idcobranca

 

Essa query me retorna o ID da forma de cobracanca cadastrada e a autorizacao(id) de um associado caso haja mais de uma cadastrada forma de cobranca cadastrada, para a instituição de cobranca igaul a 9. Ele me retorna todas as IDs e autorizacoes e não o count de IDs para a autorizacao.

A tabela é uma tabela derivada uma relação entre associatdo e instituicao de cobranca, só que ela não importa as chaves estrangeiras como Primary Key, a tabela tem um indice automático para cada dado inserido. Não há outras restrições assim sendo o assocido pode ter a mesma forma de cobrança cadastrada duas vezes ou mais, o que não é o ideal, com IDs diferentes.

O que eu queria é, para uma autorizacao que possui a mesma instituicao de cobranca cadastrado duas vezes ou mais, exclua todos os dados de cobranca menos um podendo ser esse dado o maior ou menor ID da cobrança.

Resumindo Exlcui todos os reptidos e deixa apensa um.

Alguém da uma força, tentei ser o mais claro possível.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro você estabelecer qual será o critério para manter um registro e deletar outros (mais antigo, mais noo etc)

Segundo fazer um select que liste as "chaves" duplicadas , entre aspas pois nem sempre é uma chave

Terceiro fazer um bloco ou programa do tipo

vn_chave_ant 
cursor
select "chave"
from tabela
where "chave" in (select "chave"                 
                  from tabela                 
                  group by "chave"                 
                  having count(*) > 1)
Ler cursor enquanto nao fim  
se cursor."chave" <> vn_chave_ant     
  vn_chave_ant := cursor."chave"  
senao    
  deleta tabela where "chave" = cursor."chave" 
  e idregistro = cursor.idregistro   
fimse
fim ler

ou seja será preciso ter algo que identifique o registro , no Oracle se pode usar o ROWID no SQlServer não sei mas deve ter algo similar

Antes de tudo isto fazer duas salvas e se possível simular num ambiente de testes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu seres miticos!

 

Estava pensando em seguir a primeira linha de raciocinio. Pegar os registros duplicados, jogar em uma @table ou #tmp, excluir o maior ou menor registro duplicado dessa table e depois excluir os registros equivalentes na tabela de origem.

Só que gostaria de ver se haveria outros recursos.

 

Sempre trabalho em um ambiente de teste Motta, principalmente alterações deste tipo, valeu pela dica!

 

Valeu!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.