ORACLE: Búsqueda de 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 servidores de bases de datos como ORACLE, 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. Por ejemplo, en la siguiente consulta ORACLE 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 ORACLE, 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: