Algumas dessas abordagens parecem um pouco complicadas, e geralmente faço isso como:
Dada a tabela
table
, deseja excluí-lo em (campo1, campo2) mantendo a linha com o campo máximo3:DELETE FROM table USING table alias
WHERE table.field1 = alias.field1 AND table.field2 = alias.field2 AND
table.max_field < alias.max_field
Por exemplo, eu tenho uma tabela,
user_accounts
, e quero adicionar uma restrição exclusiva no email, mas tenho algumas duplicatas. Diga também que eu quero manter o criado mais recentemente (ID máximo entre duplicatas). DELETE FROM user_accounts USING user_accounts ua2
WHERE user_accounts.email = ua2.email AND user_account.id < ua2.id;
- Observação -
USING
não é SQL padrão, é uma extensão do PostgreSQL (mas muito útil), mas a pergunta original menciona especificamente o PostgreSQL.