Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Jak najít a odstranit duplicitní záznamy v databázi Firebird

Příkaz DELETE (jak je definován v standardu SQL) vždy smaže všechny záznamy, které splňují podmínku. Obvykle chceme ponechat jeden z duplicitních záznamů a smazat ostatní. K tomu potřebujeme použít RDB$DB_KEY - implicitní fyzické číslo záznamu v databázi Firebird, které lze použít k vytvoření umělého rozdílu mezi identickými záznamy.

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))

V tomto případě používáme fyzický RDB$DB_KEY k rozlišení 2 záznamů s identickým obsahem v určených polích (column1, column2 atd.) a záznam s větším RDB$DB_KEY.

Pro nalezení duplicit můžete použít následující dotaz s podmínkou 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)