ACCESS: Búsqueda de registros duplicados

Si ya resulta casi imposible controlar a mano los duplicados en bases de datos pequeñas, cuando se trata de conjuntos de datos grandes, como los gestionados por bases de datos como ACCESS, estos solo se pueden mantener bajo control con los medios auxiliares adecuados.

En general, se debe establecer una diferencia entre los duplicados exactos y los duplicados difusos. Encontrará más información sobre los duplicados difusos en el artículo "Duplicados con pequeñas diferencias". Con las consultas de SQL resulta relativamente sencillo encontrar duplicados exactos, o sea, aquellos registros duplicados en que todos los resultados coinciden carácter por carácter a excepción de las mayúsculas y minúsculas. Bien es cierto que el asistente de consultas de ACCESS cuenta con una opción para crear una consulta de búsqueda de duplicados, pero la lista de resultados muestra solo los términos que aparecen por duplicado y la frecuencia con que figuran en la tabla. Por desgracia, este método no permite eliminar los duplicados encontrados. En consecuencia, en ACCESS resulta inevitable realizar una consulta propia de SQL para tal fin.

Para ello, lo más sencillo es crear primero un nuevo proyecto de consulta y, a continuación, pasar a introducir directamente los comandos de SQL a través de la entrada del menú "Vista SQL" del menú contextual o mediante el símbolo "SQL" en el margen inferior derecho de la ventana. En este punto, se pueden introducir directamente comandos de SQL como en otros servidores de bases de datos. Con el botón "Ejecutar", se puede ejecutar el comando de SQL introducido. A través del pequeño símbolo "SQL" en el margen inferior derecho de la ventana, se puede regresar desde aquí a la consulta de SQL correspondiente.

Por ejemplo, en la siguiente consulta ACCESS devuelve todos los registros en los que coincide el contenido del campo de datos 'name':

SELECT tab1.id, tab1.name, tab2.id, tab2.name
FROM tablename tab1, tablename tab2
WHERE tab1.name=tab2.name
AND tab1.id<>tab2.id
AND tab1.id=(SELECT MAX(id) FROM tablename tab
WHERE tab.name=tab1.name)

Como se puede observar, para este comando de SQL se requiere una columna con una ID que identifica el registro de datos correspondiente de manera inequívoca para garantizar que un registro de datos no se compare consigo mismo. Asimismo, esta ID se requiere para garantizar que el registro de datos con la mayor ID solo figure en la columna "tab1.id" y no en la columna "tab2.id". De este modo, se evita que el registro de datos con la mayor ID se elimine también de un grupo de duplicados. Las ID de los registros de datos que se vayan a eliminar figuran en la columna "tab2.id". El resultado, incorporado en un comando DELETE para Access, se ve de la siguiente manera:

DELETE FROM tablename 
WHERE id IN
(SELECT tab2.id
FROM tablename tab1, tablename tab2
WHERE tab1.name=tab2.name
AND tab1.id<>tab2.id
AND tab1.id=(SELECT MAX(id) FROM tablename tab
WHERE tab.name=tab1.name))

Como es natural, este comando de SQL se puede ampliar fácilmente de tal manera que, además del contenido del campo de datos 'name', también se comparen otros campos de datos, p. ej. aquellos que contienen la dirección postal de forma conjunta.

En el artículo 'Búsqueda difusa de duplicados con SQL', podrá informarse de las posibilidades que ofrece SQL a la hora de buscar duplicados difusos. No obstante, este problema solo se puede solucionar de manera satisfactoria con herramientas especializadas que ofrecen una búsqueda de registros duplicados con tolerancia a fallos, p. ej. DataQualityTools: