Я использую Firebird 3.0 и у меня есть 3 таблицы:
Таблица1: tbl1_id (ПК), f2_id (ФК), tbl1_f1
tbl1_f2 — внешний ключ для таблицы2.
Таблица 2: f2_id (ПК), f3_id (ФК)
f3_id — внешний ключ для таблицы 3.
Таблица3: f3_id (ПК), tbl3_code
Теперь мне нужно установить Table1.tbl1_f1 = 1, где Table3.tbl3_code = 'value', поэтому я написал этот SQL:
update table1 set tbl1_f1 = 1 where (tbl1_f1 is null)
and table1.tbl1_id in (
select
tbl1_id
from table1
inner join Table2 on (Table1.f2_id = Table2.f2_id)
inner join Table3 on (Table2.f3_id = Table3.f3_id)
where (Table3.tbl3_code = 'value')
)
Является ли мой обновленный SQL правильным или есть лучший способ написать его?
MERGE
- person Mark Rotteveel   schedule 12.07.2016update table1 ... where (tbl1_f1 is null) and ( 'value' = ( select Table3.tbl3_code from Table3, Table2 where (Table2.f3_id = Table3.f3_id) and (Table1.f2_id = Table2.f2_id) ) )
? Если это работает (то есть внутренний выбор всегда возвращает один элемент, а не нулевые строки и не много строк), это может быть лучше или хуже, чем подход for-select @rstrelba (вам нужно будет проверить и сравнить PLAN и статистику операторов для оба на ваших реальных данных) - person Arioch 'The   schedule 13.07.2016