Firebird 데이터베이스에서 중복 레코드를 찾고 삭제하는 방법
DELETE 명령은 (SQL 표준에 정의된 대로) 항상 조건을 만족하는 모든 레코드를 삭제합니다. 일반적으로 우리는 중복 항목 중 하나를 남기고 나머지를 삭제하려고 합니다. 이를 위해 Firebird 데이터베이스에서 암시적 물리적 레코드 번호인 RDB$DB_KEY를 사용하여 동일한 레코드 간에 인위적인 차이를 만들 수 있습니다.
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))
이 경우, 물리적 RDB$DB_KEY를 사용하여 지정된 필드(column1, column2 등)에서 동일한 내용을 가진 두 레코드를 구분하며, 더 큰 RDB$DB_KEY를 가진 레코드를 삭제합니다.
중복 항목을 찾으려면 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)