Pregunta

¿Cuál es un ejemplo de un SQL rápido para obtener duplicados en conjuntos de datos con cientos de miles de registros? Normalmente uso algo como:

SELECT afield1, afield2 FROM afile a 
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1);

Pero esto es bastante lento.

¿Fue útil?

Solución

Esta es la forma más directa:

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1

Otros consejos

Puedes probar:

select afield1, afield2 from afile a
where afield1 in
( select afield1
  from afile
  group by afield1
  having count(*) > 1
);

Se hizo una pregunta similar la semana pasada. Hay algunas buenas respuestas allí.

SQL para encontrar entradas duplicadas (dentro de un grupo)

En esa pregunta, el OP estaba interesado en todas las columnas (campos) en la tabla (archivo), pero las filas pertenecían al mismo grupo si tenían el mismo valor clave (afield1).

Hay tres tipos de respuestas:

subconsultas en la cláusula where, como algunas de las otras respuestas aquí.

una unión interna entre la tabla y los grupos vistos como una tabla (mi respuesta)

y consultas analíticas (algo nuevo para mí).

Por cierto, si alguien quiere eliminar los duplicados, he usado esto:

delete from MyTable where MyTableID in (
  select max(MyTableID)
  from MyTable
  group by Thing1, Thing2, Thing3
  having count(*) > 1
)

Esto debería ser razonablemente rápido (incluso más rápido si los dupeFields están indexados).

SELECT DISTINCT a.id, a.dupeField1, a.dupeField2
FROM TableX a
JOIN TableX b
ON a.dupeField1 = b.dupeField2
AND a.dupeField2 = b.dupeField2
AND a.id != b.id

Supongo que el único inconveniente de esta consulta es que debido a que no está haciendo un COUNT (*) no puede verificar el número de veces que es duplicado, solo que aparece más de una vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top