Eu tenho duas tabelas em um banco de dados PostgreSQL 9.3: Table link_reply
tem uma chave estrangeira chamada which_group
apontando para table link_group
.
Eu quero excluir todas as linhas de link_group
onde não link_reply
existe nenhuma linha relacionada. Parece básico o suficiente, mas eu tenho lutado com isso.
Será algo simples assim (não está funcionando)?
DELETE FROM link_group WHERE link_reply = NULL;
Citando o manual:
Minha ênfase em negrito. Usar informações que não estão contidas em outra tabela é um pouco complicado, mas existem soluções fáceis. Do arsenal de técnicas padrão para ...
... um
NOT EXISTS
anti-semi-join é provavelmente o mais simples e eficiente paraDELETE
:Assumindo (já que as definições de tabela não são fornecidas)
link_group_id
como nome da coluna para a chave primária delink_group
.A técnica que @Mihai comentou também funciona (aplicada corretamente):
Mas como a expressão de tabela na
USING
cláusula é unida à tabela de destino (lg
no exemplo) com umCROSS JOIN
, você precisa de outra instância da mesma tabela como trampolim (lg1
no exemplo) para oLEFT JOIN
, que é menos elegante e normalmente mais lento.