Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Remover linhas duplicadas deixando apenas a linha mais antiga?


Como você está usando a coluna id como um indicador de qual registro é 'original':
delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Isso deixará um registro por endereço de e-mail.

edite para adicionar:

Explicando a pergunta acima...

A ideia aqui é juntar a mesa contra ela mesma. Finja que você tem duas cópias da tabela, cada uma com um nome diferente. Então você pode compará-los entre si e encontrar o ID mais baixo ou para cada endereço de e-mail. Você verá os registros duplicados que foram criados posteriormente e poderá excluí-los. (Eu estava visualizando o Excel ao pensar sobre isso.)

Para fazer essa operação em uma tabela, compará-la consigo mesma e poder identificar cada lado, você usa aliases de tabela. x é um alias de tabela. É atribuído no from cláusula assim:from <table> <alias> . x agora pode ser usado em outro lugar na mesma consulta para se referir a essa tabela como um atalho.

delete x inicia a consulta com nossa ação e alvo. Vamos realizar uma consulta para selecionar registros de várias tabelas e queremos excluir os registros que aparecem em x .

Os aliases são usados ​​para se referir a ambas as 'instâncias' da tabela. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail bate a tabela contra si mesma onde os e-mails correspondem. Sem a cláusula where a seguir, cada registro seria selecionado, pois poderia ser unido a si mesmo.

O where cláusula limita os registros selecionados. where x.id > z.id permite o alias de 'instância' x para conter apenas os registros que correspondem aos e-mails, mas têm um id maior valor. Os dados que você realmente deseja na tabela, endereços de e-mail exclusivos (com o menor id) não farão parte de x e não será deletado. Os únicos registros em x serão registros duplicados (endereços de e-mail) com um id maior do que o registro original para esse endereço de e-mail.

As cláusulas join e where podem ser combinadas neste caso:
delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Para evitar duplicatas, considere tornar a coluna subscriberEmail uma coluna indexada UNIQUE.