Цитуючи посібник:
Існує два способи видалення рядків у таблиці, використовуючи інформацію, що міститься в інших таблицях бази даних: за допомогою під-вибору або вказуючи додаткові таблиці в 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, який менш елегантний і, як правило, повільніше.