Удалить строки в таблице на основе значения столбца в третьей таблице

У меня есть три таблицы Table1, Table2 и Table3 и следующий запрос, который удаляет строки в Table1

delete from Table1 
where EXISTS
(select (1) from Table2
 where Table1.col1=Table2.col1
 AND   Table1.col2=Table2.col2
 AND   Table1.col3=(select **Table3.col3 from Table3** inner join Table2 on Table3.col1=Table2.col1)

Этот запрос правильный? Если нет, то как использовать третью таблицу внутри условия where?

Изменить: Также, пожалуйста, объясните, как переписать запрос, если мы хотим удалить строки из таблицы 2, которая сама объединена с таблицей 3?

1 ответ

Решение

Вот один из способов сделать это:

delete from table1 
where (col1, col2, col3) in (
  select t1.col1, t1.col2, t1.col3
  from table1 t1
    join table2 t2 on t1.col1 = t2.col1 and t1.col2 = t2.col2
    join table3 t3 on t1.col3 = t3.col3 and t2.col1 = t3.col1
  );

Или используя EXISTS может быть быстрее:

delete table1 
where exists (
  select * 
  from table2
    join table3 on table2.col1 = table3.col1
  where table1.col3 = table3.col3 and 
    table1.col1 = table2.col1 and 
    table1.col2 = table2.col2);
Другие вопросы по тегам