2008-10-13 22 views

Respuesta

74

Ésta es la manera más directa:

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

Usted podría intentar:

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

Esta es mi forma preferida porque puede devolver todas las columnas de la tabla. – leek

+0

Curiosamente, 2 personas han votado esta respuesta sin hacer ningún comentario sobre por qué. Supongo que esto significa que hay algo mal con eso? –

+0

Supongo que es más lento –

5

Una pregunta similar se le pidió la semana pasada. Hay algunas buenas respuestas allí.

SQL to find duplicate entries (within a group)

En esta cuestión, el OP se interesó por todas las columnas (campos) en la tabla (archivo), pero filas pertenecían al mismo grupo si tuvieran el mismo valor de clave (afield1).

Hay tres tipos de respuestas:

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

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

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

5

Por cierto, si alguien quiere eliminar los duplicados, he utilizado este:

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

Acabo de notar que esto solo eliminará uno de los duplicados. Si hubiera tres filas con el mismo valor, tendría que ejecutar esta consulta dos veces para eliminar todos los duplicados. –

3

Ésta debe ser razonablemente rápido (incluso más rápido si se indexan los dupeFields).

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 la única desventaja de esta consulta es que debido a que no está haciendo un COUNT(*) no se puede comprobar el número de veces que se duplica, sólo que aparece más de una vez.

+0

Esto no es realmente rápido cuando lo intento en mi mesa. Aunque no tengo un índice. –

Cuestiones relacionadas