Eu tenho duas tabelas em um banco de dados PostgreSQL 9.3: A tabela link_reply
possui uma chave estrangeira chamada which_group
apontando para a tabela link_group
.
Quero excluir todas as linhas de link_group
onde não link_reply
existe nenhuma linha relacionada . Parece bastante básico, mas eu tenho lutado com isso.
Será algo simples assim (não está funcionando)?
DELETE FROM link_group WHERE link_reply = NULL;
postgresql
join
postgresql-9.3
delete
Hassan Baig
fonte
fonte
DELETE FROM links_group USING links_group AS lg LEFT JOIN links_reply AS lr ON lg.col= lr.some_other_col WHERE links_reply.some_other_col IS NULL
Respostas:
Citando o manual:
Negrito ênfase minha. 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 à ...
... uma
NOT EXISTS
anti-semi-junção é provavelmente mais simples e mais eficiente paraDELETE
:Assumindo (como as definições da tabela não são fornecidas)
link_group_id
como o nome da coluna da chave primária delink_group
.A técnica que @Mihai comentou também funciona (aplicada corretamente):
Mas como a expressão da tabela na
USING
cláusula é associada à tabela de destino (lg
no exemplo) com aCROSS JOIN
, você precisa de outra instância da mesma tabela que trampolim (lg1
no exemplo) para oLEFT JOIN
, que é menos elegante e geralmente mais lento.fonte