Этот запрос:
delete from table2
using table2 as t2 left join table1 as t1
on t2.ID_TAB1=t1.ID
where t1.DATA='xxx';
Фактически удаляет все строки из table2
(или ни одной, если в where
нет совпадений. У вас нет связи между t2
и table2
, так что по сути это перекрестное соединение.
Как объяснено (в глубине души) в документации :
Не повторяйте целевую таблицу в using_list, если только вы не хотите настроить самостоятельное соединение.
Предположительно, удаление всех строк вызывает проблему с третьей таблицей. Обратите внимание, что строки, которые вы действительно хотите удалить, также могут быть причиной проблемы. В этом случае вам нужно обрабатывать ошибки, используя некую каскадную логику.
Вы можете выразить это, используя предложение using
и удалив join
:
delete from table2 t2
using table1 t1
where t2.ID_TAB1 = t1.ID and
t1.DATA = 'xxx';
Или просто используйте exists
в предложении where
:
delete from table2 t2
where exists (select 1
from table1 t1
where t1.id = t2.id_tab1 and t1.data = 'xxx'
);