• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ricardocoimbra

Remover registo duplicado

8 mensagens neste tópico

Tenho uma coluna com varios nomes, pretendo que qualquer nome que seja igual seja removido, como poderia fazer isso?

Ups podiam transferir para o topic d duvidas!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pesquisei um bocado e encontrei isto

delete from table1
USING table1, table1 as vtable
WHERE (NOT table1.ID=vtable.ID)
AND (table1.field_name=vtable.field_name)

1. Here you tell mysql that there is a table1.
2. Then you tell it that you will use table1 and a virtual table with the values of table1.
3. This will let mysql not compare a record with itself!
4. Here you tell it that there shouldn’t be records with the same field_name.

http://www.cyberciti.biz/faq/howto-removing-eliminating-duplicates-from-a-mysql-table/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao estou a ver essa query a funcionar por varias razoes, uma delas e' porque estas a fazer uma query 'a tabela que queres apagar. Para alem do mais pode apagar mais do que aquilo que precisas sem dares por ela.

O melhor mesmo e' seguir passos mais 'seguros' especialmente porque estamos a falar de apagar dados.

Primeiro vamos ver quantos duplicados e' que temos.

SELECT nome FROM aMinhaTabela GROUP BY nome HAVING COUNT(*)>1

Crias uma tabela exactamente igual 'a original mas vazia.

CREATE TABLE aMinhaTabela_Copia LIKE aMinhaTabela

Vou assumir que so queres mesmo os nomes, o resto dos registos da tabela nao sao considerados, ou so tens uma coluna.

SELECT DISTINCT nome INTO aMinhaTabela_Copia FROM aMinhaTabela

Se estas a tentar apagar algo do tipo

...

Joao | Silva

Joao | Peixoto

Joao | Torres

...

E so queres tambem manter pelo menos um dos ultimos nomes, entao isto vai ter de ser pensado de maneira diferente.

Verifica que na nova tabela nao existem duplicados

SELECT nome FROM aMinhaTabela_Copia GROUP BY nome HAVING COUNT(*)>1

Se esta tudo em ordem, podes apagar tudo o que esta na original

TRUNCATE TABLE aMinhaTabela

Depois copias tudo para a nova tabela

SELECT * INTO aMinhaTabela FROM aMinhaTabela_Copia

Nao e' muito bonito nem muito rapido, mas garante que nao haja erros.

Se isto nao for 100% o que queres, e' so dizer!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se acontecer o que eu disse atras, ou seja, existem registos duplicados com mais campos e queres manter um qualquer, nao importa qual, trocas este passo:

SELECT DISTINCT nome INTO aMinhaTabela_Copia FROM aMinhaTabela

por este

SELECT * FROM aMinhaTabela T1, aMinhaTabela T2 WHERE T1.nome=T2.nome AND ultimoNome>ultimoNome

Faz o mesmo que esta em cima, mas guarda o registo (neste caso especifico) com o "maior" ultimo nome. Podes mudar este criterio conforme aquele que te agrada em mais tendo em conta que so vais poder manter um deles.

Se ultimo nome te faz um bocado de confusao, imagina que o teu criteria esta na idade e escolhes o Joao mais velho. Agora ate podia sair a piada facil...

Abraco

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nao estou a ver essa query a funcionar por varias razoes, uma delas e' porque estas a fazer uma query 'a tabela que queres apagar. Para alem do mais pode apagar mais do que aquilo que precisas sem dares por ela.

Huh ... se reparares aquilo cria uma tabela virtual e testa se os ids sao diferentes. Se forem e os nomes forem iguais, então vai eliminar. Eu não testei, mas acho que é provavel que funcione.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E se o nome e' o campo candidato para ser PK e nao tens uma coluna de identidade?

Para alem do mais, nao gosto muito do USING que esta ali. Nem consigo encontrar na net o que faz aquilo. Suponho que seja apenas mais uma keyword que faz o que uma qualquer existente ja faz.

Bottom line is...

Eu nao estou a dizer que a tua query esta mal mas tem uma grande probabilidade de nao funcionar e uma probabilidade ainda muito maior de apagar o que nao deve ser apagado. Nao custa nada garantir que nao perdes o que ja tens.

O assunto de apagar registos duplicados de uma tabela ainda e' um assunto delicado exactamente por nao poderes apagar uma tabela e fazer-lhe uma query ao mesmo tempo.

Mas se a tua query funcionar para ele, e' um metodo bem mais rapido ;-) sem duvida. Mas ao custo de perderes o que nao podes perder provavelmente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Creio que queres algo como isto:

delete from tabela where id in (
select max(t1.id) from tabela t1, tabela t2
where t1.id <> t2.id and t1.nome = t2.nome);

commit;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda estou a desenvolver essa parte de remover, mas quando conseguir coloco o resultado, mas a todos desde já o meu muito obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora