Как обновить записи на основе значений из другой таблицы?

Я использую 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 правильным или есть лучший способ написать его?


person William    schedule 12.07.2016    source источник
comment
Краткий обзор дубликата: используйте MERGE   -  person Mark Rotteveel    schedule 12.07.2016
comment
@MarkRotteveel Я не знаю, какую таблицу использовать в качестве источника, если возможно, дайте мне ответ, используя Merge   -  person William    schedule 12.07.2016
comment
как насчет update 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
comment
@Wel Для источника слияния вы также можете использовать выбор   -  person Mark Rotteveel    schedule 14.07.2016


Ответы (1)


person    schedule
comment
лучше переместить tbl1_f1 is null проверку внутрь цикла for-select - person Arioch 'The; 13.07.2016