sql >> Base de Datos >  >> RDS >> Mysql

¿Eliminar filas duplicadas dejando solo la fila más antigua?

Dado que está utilizando la columna id como indicador de qué registro es 'original':

delete x 
from myTable x
 join myTable z on x.subscriberEmail = z.subscriberEmail
where x.id > z.id

Esto dejará un registro por dirección de correo electrónico.

editar para agregar:

Para explicar la consulta anterior...

La idea aquí es unir la mesa contra sí misma. Imagina que tienes dos copias de la tabla, cada una con un nombre diferente. Luego, podría compararlos entre sí y encontrar la identificación más baja para cada dirección de correo electrónico. Luego vería los registros duplicados que se crearon más adelante y podría eliminarlos. (Estaba visualizando Excel cuando pensaba en esto).

Para hacer esa operación en una tabla, compararla consigo misma y poder identificar cada lado, usas alias de tabla. x es un alias de tabla. Se asigna en el from cláusula así:from <table> <alias> . x ahora se puede usar en otra parte de la misma consulta para hacer referencia a esa tabla como acceso directo.

delete x comienza la consulta con nuestra acción y objetivo. Vamos a realizar una consulta para seleccionar registros de varias tablas y queremos eliminar los registros que aparecen en x .

Los alias se utilizan para referirse a ambas 'instancias' de la tabla. from myTable x join myTable z on x.subscriberEmail = z.subscriberEmail golpea la mesa contra sí misma donde coinciden los correos electrónicos. Sin la cláusula where que sigue, cada registro se seleccionaría ya que podría unirse contra sí mismo.

El where cláusula limita los registros que se seleccionan. where x.id > z.id permite la 'instancia' con alias x para contener solo los registros que coinciden con los correos electrónicos pero tienen un id más alto valor. Los datos que realmente desea en la tabla, las direcciones de correo electrónico únicas (con la identificación más baja) no serán parte de x y no será borrado. Los únicos registros en x habrá registros duplicados (direcciones de correo electrónico) que tengan un id mayor que el registro original para esa dirección de correo electrónico.

Las cláusulas join y where podrían combinarse en este caso:

delete x 
  from myTable x 
  join myTable z
    on x.subscriberEmail = z.subscriberEmail
      and x.id > z.id

Para evitar duplicados, considere hacer que la columna SubscriberEmail sea una columna indexada ÚNICA.