2016-09-02 5 views
1

У меня есть 2 таблицы, и я хочу написать 2 обновления.
tbl_stage с идентификатором, флагом (null) и счетом (null).
tbl_source с идентификатором, счетом, обновленной колонкой.

обновление 2 столбца на основе значений из другой таблицы

Перед обновлением

tbl_stage     tbl_source 
id flag count  id count updated 
abc NULL NULL  abc 9.0  false 
          def 3.6  false 

Я хочу обновить tbl_stage.count = tbl_source.count и tbl_stage.flag = истинное, где tbl_stage.id = tbl_source.id.
И еще один, tbl_source.updated = true, где tbl_stage.id = tbl_source.id.

После обновления должно выглядеть следующим образом.

tbl_stage     tbl_source 
id flag count  id count updated 
abc true 9.0   abc 9.0  true 
          def 3.6  false 
+1

Добавить пример данных таблицы, как до, так и после версий. Также помечайте используемые вами dbms, некоторые из них имеют немного другой синтаксис для этих обновлений. – jarlh

+0

@jarlh сделано как предложено –

+0

Отлично! (Слишком плохо, я не знаю Postgresql очень хорошо.) – jarlh

ответ

0

Вам необходимо использовать 2 оператора UPDATE, так как обновление 2 таблиц в одном из операторов недоступно.

update tbl_stage 
set [count]=tbl_source.count 
    ,flag = 1 
FROM tbl_source WHERE tbl_stage.id=tbl_source.id 

update tbl_source 
set updated = 1 
from tbl_source WHERE tbl_stage.id=tbl_source.id 
and tbl_stage.count=tbl_source.count 
+1

Do *** not *** повторите таблицу целей в списке 'FROM'. Это создаст перекрестное соединение. Используйте только 'update tbl_stage из tbl_source где ....' –

+0

@a_horse_with_no_name Вы имеете в виду обновление tbl_stage set tbl_stage.count = tbl_source.count , tbl_stage.flag = 1 внутреннее соединение tbl_source на tbl_stage.id = tbl_source.id? –

+0

@santosh - Могу ли я использовать внутреннее соединение, как и предыдущий запрос на обновление? –

0

Вы можете сделать это с помощью одного оператора, меняя обе таблицы на одном дыхании:

with stage_update as (
    update stage 
    set cnt = s.cnt, 
     flag = true 
    from source s 
    where stage.id = s.id 
    returning s.id 
) 
update source 
    set updated = true 
where id in (select id from stage_update); 

(я выбрал cnt для имени столбца, потому что count является зарезервированным словом, и не следует использовать в качестве идентификатора)

+0

Это хорошая идея для обновления на миллион строк каждые 10 минут? –

+0

@RedshiftGuy: Вы просили об этом ... Я не могу сказать, хорошая ли это идея. –

Смежные вопросы