Más rápido & # 8220; Obtenga duplicados & # 8221; Secuencia de comandos SQL
-
10-07-2019 - |
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.
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.