Pregunta

Tengo una tabla de Access 2003 con ~ 4000 registros que se realizó a partir de 17 tablas diferentes. Aproximadamente la mitad de estos registros son duplicados. No hay una columna de identificación única (id, nombre, etc.). Hay una columna de identificación que se completó automáticamente cuando se combinaron las tablas, lo que significa que los duplicados no son completamente idénticos (aunque esta columna podría eliminarse si facilita las cosas).

He utilizado el Asistente de consultas de Access Find Duplicates, que me da una lista de los registros duplicados, pero no me permite eliminarlos (¿de qué sirve esta consulta si no puedo eliminarlos?). He intentado convertir la consulta generada en una consulta de eliminación, pero eso cambia el número de filas que encuentra. Yo alteraría el sql a mano pero está un poco más allá de mí y tiene 7 líneas de longitud.

¿Alguien sabe una buena manera de deshacerse de los duplicados?

¿Fue útil?

Solución

La razón por la que la consulta de búsqueda de duplicados no le permite eliminar los registros es porque básicamente es solo una consulta agregada, cuenta el número de duplicados que encuentra y devuelve los casos en los que el recuento es mayor que 1.

Considera que si hicieras una consulta de eliminación basada en los duplicados de búsqueda, eliminaría todas las filas que tienen valores duplicados, lo que tal vez no sea lo que quieres. Desea eliminar todos menos uno de los duplicados.

Debería intentar eliminar todos los duplicados de un registro, excepto uno, excluyendo la columna de ID en su comparación. Sugiero que la forma más sencilla de hacer esto es hacer una consulta de creación de todos los único valores (seleccione Distinct Field1, Field2 ... from MyTable) para cada campo excepto para el campo ID, usando los resultados en a para crear una nueva tabla de alrededor de 2000 registros (si la mitad son duplicados).

Luego, cree una columna de ID en su nueva tabla, use una consulta de actualización para actualizar este ID a la primera ID coincidente en la tabla original (puede hacerlo usando DLookup , que devolverá el primer valor de EXPRESSION donde CRITERIA es verdadero en DOMAIN ).

  

La función DLookup () devuelve uno   valor de un solo campo, incluso si más   que un disco satisface la   criterios Si ningún registro satisface la   criterios, o si el dominio no contiene   registros, DLookup () devuelve un valor nulo.

Dado que está identificando la primera ID coincidente en función de todos los otros campos, que son valores únicos, las ID no coincidentes pertenecerán a duplicados. Estará invirtiendo la relación PK, identificando la primera clave coincidente dado un conjunto de campos únicos. Después de eso, debes configurar la ID para que sea PK. Por supuesto, esto supone que el ID no tiene un significado inherente, y no le importa mantener un ID particular para una fila duplicada dada sobre cualquiera de los ID que pertenecen a las otras filas duplicadas. Esto supone que le importan los datos en la columna de ID, por lo que desea conservarlos para todas las filas restantes; de lo contrario, simplemente ignore el paso de búsqueda de DL y realice una Selección Distinta en todas las columnas, excepto la ID.

Otros consejos

Utilice una selección con todas las columnas excepto la columna de ID:

SELECT DISTINCTROW Column1, Column2, Column3 
INTO MYNEWTABLE
FROM TABLE

Puedes simplemente intercambiar los nombres.

Esta solución le dará una nueva tabla sin duplicados.

Lo siguiente conservará los ID originales y lo hará en un solo paso:

DELETE FROM table_with_duplicates 
WHERE table_with_duplicates.id NOT IN 
    (SELECT max(id) 
    FROM table_with_duplicates 
    GROUP BY duplicated_field_1, duplicated_field_2, ...
    )

Ahora tiene la tabla original sin duplicados y con identificaciones preservadas. Y siempre recuerde hacer una copia de seguridad de sus datos antes de intentar BORRAR grandes.

DELETE * FROM table_with_duplicates
WHERE table_with_duplicates.ID In 
    (SELECT max(ID) 
     FROM table_with_duplicates 
     GROUP BY [duplicated_field_1] 
     HAVING Count(*)>1
    )

En realidad, encontré una solución muy simple, pero todos sus campos son iguales a los de un registro duplicado completo, luego haga una consulta con cada campo y clasifique por " Agrupar POR " ;. Por lo tanto, los duplicados se combinarán y usted puede simplemente agregar esta información a una nueva tabla y renombrarla de la misma manera que la tabla existente. Si tiene un campo de clave principal, simplemente puede ignorarlo en la consulta y aún así se combinarían los datos (suponiendo que no le importan los datos en el campo principal). No sé por qué nadie ha mencionado que esta solución me tomó 5 horas. Venir con. :)

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