Cách tìm và xóa các bản ghi trùng lặp trong cơ sở dữ liệu Firebird
Lệnh DELETE (như được định nghĩa trong chuẩn SQL) luôn xóa tất cả các bản ghi thỏa mãn điều kiện. Thông thường, chúng ta muốn giữ lại một trong các bản ghi trùng lặp và xóa các bản ghi khác. Để làm điều đó, chúng ta cần sử dụng RDB$DB_KEY - một số thứ tự bản ghi vật lý ngầm trong cơ sở dữ liệu Firebird, nó có thể được sử dụng để tạo ra sự khác biệt nhân tạo giữa các bản ghi giống hệt nhau.
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))
Trong trường hợp này, chúng ta sử dụng RDB$DB_KEY vật lý để phân biệt 2 bản ghi có nội dung giống hệt nhau trong các trường được chỉ định (column1, column1, v.v.), và bản ghi có RDB$DB_KEY lớn hơn.
Để tìm các bản ghi trùng lặp, bạn có thể sử dụng truy vấn sau với điều kiệ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)