Esta página fue traducida automáticamente. Lee el original en inglés. English

Biblioteca de IBSurgeon

Cómo encontrar y eliminar registros duplicados en la base de datos Firebird

El comando DELETE (tal como se define en el estándar SQL) siempre elimina todos los registros que satisfacen la condición. Normalmente, queremos dejar uno de los duplicados y eliminar los demás. Para hacerlo, necesitamos usar RDB$DB_KEY, un número de registro físico implícito en la base de datos Firebird, que se puede utilizar para crear una diferencia artificial entre registros idénticos.

DELETE FROM XXX T1 WHERE EXISTS (SELECT * FROM XXX T2 WHERE (T2.column1 = T1.column1 or (T2.column1 is null and T2.column1 is null)) AND (T2.column2 = T1.column2 or (T2.column2 is null and T2.column2 is null)) AND (.......) AND (T2.RDB$DB_KEY > T1.RDB$DB_KEY))

En este caso, estamos utilizando el RDB$DB_KEY físico para distinguir 2 registros con contenido idéntico en los campos especificados (column1, column2, etc.), y el registro con el RDB$DB_KEY mayor.

Para encontrar duplicados, puede utilizar la siguiente consulta con la condición RDB$DB_KEY:

SELECT * FROM TABLE T1 WHERE EXISTS (SELECT FIELD FROM TABLE T2 WHERE T1.FIELD = T2.FIELD AND T1.RDB$DB_KEY != T2.RDB$DB_KEY)