Ir para conteúdo

POWERED BY:

Arquivado

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

JuLIOOXX

Comparar registros duplicados da mesma tabela

Recommended Posts

Boa noite pessoal.

 

O que acontece:

tenho uma query com replace que adiciona dados em 3 tabelas, porém não contava que o replace so sobreescreve quando o campo passado como parametro seja PK ou Index. por falta de atenção minha esses campos nao são PK ou Index

 

Ou seja, ficaram varios registros com os mesmos id´s com dados diferentes.

 


ID |   DATE     | CHAR
------------------------
1  | 2010-01-01 | abc
------------------------
1  | 2010-01-02 | abcd
------------------------
1  | 2010-01-03 | abcde
------------------------
2  | 2010-01-01 | xyz
------------------------
2  | 2010-01-02 | xywz

Agora pra limpar essa cagada gostaria de saber uma forma de pegar esses registros duplicados e eliminar os mais antigos.

 

Como pegar os duplicados com a data maior eu já consigo (Max(date) + Group By..).

Preciso saber agora como comparar e eliminar o mais antigo.

 

Quem puder me ajudar, estarei muito grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

posta a estrutura da tabela ai.

 

um delete com subquery resolve, não ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai que tá.

 

eu acho que resolve, mas nao cheguei na query ideal ainda, estou quebrando a cuca aqui nessa pra saber se lista somente as que nao sejam as mais atuais:

 

 

SELECT a.id, a.data_revisao, count(a.id) as total FROM carac_gerais a WHERE a.data_revisao > ANY (SELECT max(b.data_revisao) FROM carac_gerais b WHERE a.id = b.id) GROUP BY a.id HAVING total > 1

 

 

o bixo pega ali onde ta sublinhado.. preciso levar o id carregado para aquele where. parece que estou com um branco na cabeça. rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se ajuda ....

 

Maiores datas

 

SELECT ID,MAX(DATA) DATA
FROM CARAC_GERAIS

 

Menores que esta data (por ID)

 

SELECT *
FROM   CARAC_GERAIS,
      (SELECT ID,MAX(DATA) DATA
       FROM CARAC_GERAIS) VIRTUAL
WHERE  CARAC_GERAIS.ID = VIRTUAL.ID
AND    CARAC_GERAIS.DATA < VIRTUAL.DATA 

Mas este tipo de coisa tem sempre o risco de piorar as coisas a melhor solução seria restaurar

um backup, mesmo que fosse em outra base e copiar só esta tabela.

 

Boa sorte.

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.