Estou tentando excluir todas as duplicatas, mas mantendo apenas um único registro (ID mais curto). A consulta a seguir exclui as duplicatas, mas leva muitas iterações para excluir todas as cópias e manter as originais.
DELETE FROM emailTable WHERE id IN (
SELECT * FROM (
SELECT id FROM emailTable GROUP BY email HAVING ( COUNT(email) > 1 )
) AS q
)
É MySQL.
DDL
CREATE TABLE `emailTable` (
`id` mediumint(9) NOT NULL auto_increment,
`email` varchar(200) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=298872 DEFAULT CHARSET=latin1
Tente isto:
O acima funcionou para o meu teste de 50 e-mails (5 e-mails diferentes duplicados 10 vezes).
Pode ser necessário adicionar um índice na coluna 'email':
Pode ser um pouco lento para 250.000 linhas. Foi lento para mim em uma tabela que tinha 1,5 milhão de linhas (devidamente indexadas), e foi assim que criei esta estratégia:
O benefício da tabela de memória é que há um índice usado (chave primária no minID) que acelera o processo em uma tabela temporária normal.
Aqui está um processo de exclusão mais simplificado:
Aqui estão alguns dados de amostra:
Eu os corri. Aqui estão os resultados:
Conforme mostrado, a emailTable conterá a primeira ocorrência de cada endereço de e-mail e o ID original correspondente. Para este exemplo:
CAVEAT: Respondi a uma pergunta semelhante a esta sobre exclusão de tabela por meio de uma abordagem de tabela temporária .
De uma chance !!!
Aqui está uma solução Itzik rápida e real. Isso funcionará no SQL 2005 e superior.