Цитирование руководства:
Существует два способа удаления строк в таблице с использованием информации, содержащейся в других таблицах в базе данных: использование вложенных выборок или указание дополнительных таблиц в USING
предложении . Какой метод больше подходит, зависит от конкретных обстоятельств.
Жирный акцент мой. Использование информации, которая не содержится в другой таблице, немного сложно, но есть простые решения. От арсенала стандартных приемов до ...
... NOT EXISTS
анти-полусоединение, вероятно, самое простое и наиболее эффективное для DELETE
:
DELETE FROM link_group lg
WHERE NOT EXISTS (
SELECT FROM link_reply lr
WHERE lr.which_group = lg.link_group_id
);
Предполагая (поскольку определения таблиц не предоставлены) в link_group_id
качестве имени столбца для первичного ключа link_group
.
Техника @Mihai прокомментировала также хорошо (применяется правильно):
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;
Но поскольку табличное выражение в USING
предложении объединено с целевой таблицей ( lg
в примере) с помощью a CROSS JOIN
, вам необходим другой экземпляр той же таблицы в качестве ступеньки ( lg1
в примере) для объекта LEFT JOIN
, который менее элегантен и обычно медленнее.