Esta página foi traduzida por máquina. Leia o original em inglês. English

Biblioteca IBSurgeon

Como encontrar e excluir registros duplicados no banco de dados Firebird

O comando DELETE (conforme definido no padrão SQL) sempre exclui todos os registros que satisfazem a condição. Normalmente, queremos deixar um dos duplicados e excluir os outros. Para fazer isso, precisamos usar RDB$DB_KEY - um número físico implícito de registro no banco de dados Firebird, que pode ser usado para criar uma diferença 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))

Neste caso, estamos usando o RDB$DB_KEY físico para distinguir 2 registros com conteúdo idêntico nos campos especificados (column1, column2, etc), e o registro com o maior RDB$DB_KEY.

Para encontrar duplicados, você pode usar a seguinte consulta com a condição 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)