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