Citando o manual:
Há duas maneiras de excluir linhas em uma tabela usando as informações contidas em outras tabelas no banco de dados: usando sub-seleções ou especificando tabelas adicionais na USING
cláusula . Qual técnica é mais apropriada depende das circunstâncias específicas.
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 para DELETE
:
DELETE FROM link_group lg
WHERE NOT EXISTS (
SELECT FROM link_reply lr
WHERE lr.which_group = lg.link_group_id
);
Assumindo (como as definições da tabela não são fornecidas) link_group_id
como o nome da coluna da chave primária de link_group
.
A técnica que @Mihai comentou também funciona (aplicada corretamente):
DELETE FROM link_group lg
USING link_group lg1
LEFT JOIN link_reply lr ON lr.which_group = lg1.link_group_id
WHERE lg1.link_group_id = lg.link_group_id
AND lr.which_group IS NULL;
Mas como a expressão da tabela na USING
cláusula é associada à tabela de destino ( lg
no exemplo) com a CROSS JOIN
, você precisa de outra instância da mesma tabela que trampolim ( lg1
no exemplo) para o LEFT JOIN
, que é menos elegante e geralmente mais lento.