нужна помощь в понимании ОБНОВЛЕНИЕ ... ОТ - PullRequest
1 голос
/ 13 сентября 2010

, пожалуйста, помогите мне понять, как работает запрос UPDATE FROM в T-SQL.Пример запроса ниже приводит к

value-inc, value-dec
value-inc, value-dec
value-inc, value-dec
value-inc, value-dec
value-inc, value-dec
value-inc, value-dec

я ожидал этого:

null,        'value-dec'
null,        'value-dec'
null,        'value-inc'
null,        'value-inc'
null,        null
'value-inc', 'value-dec'

где я ошибаюсь?спасибо константин


declare @t table (s1 varchar(10), s2 varchar(10));

insert into @t
select null, null
union all
select null, null
union all
select null, null
union all
select null, null
union all
select null, null
union all
select null, null;

update @t
set s1 = x.s1, s2 = x.s2
from (select null as s1, 'value-dec' as s2
      union all
      select null as s1, 'value-dec' as s2
      union all
      select null as s1, 'value-inc' as s2
      union all
      select null as s1, 'value-inc' as s2
      union all
      select null as s1, null as s2
      union all
      select 'value-inc' as s1, 'value-dec' as s2) as x;

select * from @t;

Ответы [ 2 ]

1 голос
/ 14 сентября 2010

Как уже упоминалось в ответ Бена Робинсона , вам нужно общее значение между двумя таблицами, чтобы выполнить обновление ожидаемым образом. Я обновил ваш оригинальный пример, добавив столбец идентификаторов в вашу таблицу. Этот идентификатор затем используется в качестве условия соединения для обновления, как показано в приведенном ниже коде. Надеюсь, этот пример прояснит вам ситуацию.

declare @t table (id int identity, s1 varchar(10), s2 varchar(10));

insert into @t
select null, null
union all
select null, null
union all
select null, null
union all
select null, null
union all
select null, null
union all
select null, null;

update t
set s1 = x.s1, s2 = x.s2
from @t as t
inner join (select 1 as id, null as s1, 'value-dec' as s2
            union all
            select 2 as id, null as s1, 'value-dec' as s2
            union all
            select 3 as id, null as s1, 'value-inc' as s2
            union all
            select 4 as id, null as s1, 'value-inc' as s2
            union all
            select 5 as id, null as s1, null as s2
            union all
            select 6 as id, 'value-inc' as s1, 'value-dec' as s2) as x
on t.id = x.id;

select * from @t;
0 голосов
/ 13 сентября 2010

Обновление из просто позволяет вам создать набор объединений, чтобы определить, что вы хотите обновить, так же, как вы выбираете из. например,

update t1
set t1.SomeField=t2.SomeDield
from Table1 t1
inner join table2 t2 on t1.id=t2.id

В вашем примере это не сработает, потому что нет способа присоединить подзапрос к табличной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...