これらのアプローチのいくつかは少し複雑に見えます、そして私は一般的にこれを次のように行います:
与えられたテーブルtable
、最大field3で行を維持しながら(field1、field2)で一意にしたい:
DELETE FROM table USING table alias
WHERE table.field1 = alias.field1 AND table.field2 = alias.field2 AND
table.max_field < alias.max_field
たとえば、user_accounts
というテーブルがあります。 、および電子メールに一意の制約を追加したいのですが、重複がいくつかあります。また、最近作成したもの(重複の最大ID)を保持したいとします。
DELETE FROM user_accounts USING user_accounts ua2
WHERE user_accounts.email = ua2.email AND user_account.id < ua2.id;
- 注-
USING
は標準のSQLではなく、PostgreSQLの拡張機能です(ただし、非常に便利な拡張機能です)が、元の質問では特にPostgreSQLについて言及しています。