Firebird veritabanında yinelenen kayıtları bulma ve silme
DELETE komutu (SQL standardında tanımlandığı şekliyle) her zaman koşulu sağlayan tüm kayıtları siler. Genellikle, kopyalardan birini bırakıp diğerlerini silmek isteriz. Bunu yapmak için, Firebird veritabanında örtük bir fiziksel kayıt numarası olan RDB$DB_KEY kullanmamız gerekir; bu, aynı kayıtlar arasında yapay bir fark oluşturmak için kullanılabilir.
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))
Bu durumda, belirtilen alanlarda (column1, column2, vb.) aynı içeriğe sahip 2 kaydı ayırt etmek için fiziksel RDB$DB_KEY kullanıyoruz ve daha büyük RDB$DB_KEY değerine sahip kayıt silinir.
Kopyaları bulmak için RDB$DB_KEY koşuluyla aşağıdaki sorguyu kullanabilirsiniz:
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)