Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обновить одно и тоже поле записи несколько раз при соединении с источником  [new]
anvg
Member

Откуда: СПб
Сообщений: 101
Доброе время суток.
Что-то не могу понять как выполнить подобное действие
Declare @Dest As Table (id int, val nvarchar(max));
Declare @Source As Table (id int, val nvarchar(max));

Insert Into @Dest Values (1, N''), (2, N'');
Insert Into @Source Values(1, N'1'), (2, N'20'), (2, N'30');

Update TD
Set TD.val = TD.val + TS.val
From @Dest TD
Inner Join @Source TS On (TD.id = TS.id);

Select * From @Dest;

Полагал, что результат Select * From @Dest; будет как
id val
1 1
2 2030
Получается, что sql server обновляет запись только один раз. Подскажите, пожалуйста, как тогда выполнить такую операцию, чтобы все те несколько значений из источника попали в обновляемое значение?
Спасибо.
13 ноя 16, 14:31    [19887882]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить одно и тоже поле записи несколько раз при соединении с источником  [new]
anvg
Member

Откуда: СПб
Сообщений: 101
Или это возможно через "костыль"?
Declare @Dest As Table (id int, val nvarchar(max));
Declare @Source As Table (id int, val nvarchar(max));
Declare @last int, @i int;
Insert Into @Dest Values (1, N''), (2, N'');
Insert Into @Source Values(1, N'1'), (2, N'20'), (2, N'30');

If (Object_Id(N'tempdb..#tempTable', N'U') Is Not Null) Drop Table #tempTable;
Select id, val, Row_Number() Over(Partition By id Order By val) rowid
Into #tempTable From @Source;

Select @last = Max(rowid) From #tempTable;
Set @i = 1;
While (@i <= @last)
begin
       Update TD
             Set TD.val = TD.val + TS.val
       From @Dest TD
             Inner Join #tempTable TS On (TD.id = TS.id)
       Where TS.rowid = @i;
       Set @i = @i + 1;
end;

Select * From @Dest;

Извиняюсь, что не совсем правильно описал задачу (поленился описать ещё одно поле в таблице Source). В таком виде она воспринимается как задаче о сцепке строк. В реальности Set будет
Set TD.val = Replace(TD.val, TS.oldval, TS.newval)
13 ноя 16, 14:53    [19887949]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить одно и тоже поле записи несколько раз при соединении с источником  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
declare @d table (id int primary key, val nvarchar(max));
declare @s table (id int, oldval nvarchar(max), newval nvarchar(max));

insert into @d values (1, N'1'), (2, N'20 30 40');
insert into @s values (1, N'1', 'a'), (2, N'20', 'b'), (2, N'30', 'c'), (2, N'40', 'd');

declare @t table (id int, oldval nvarchar(max), newval nvarchar(max), n int, primary key(id, n));

insert into @t
 (id, oldval, newval, n)
 select
  id, oldval, newval, row_number() over (partition by id order by (select 1))
 from
  @s;

select * from @d;

with s as
(
 select
  d.id, replace(d.val, t.oldval, t.newval) as rval, t.n
 from
  @d d join
  @t t on t.id = d.id and n = 1

 union all

 select
  s.id, replace(s.rval, t.oldval, t.newval), t.n
 from
  s join
  @t t on t.id = s.id and t.n = s.n + 1
)
update d
 set
  val = r.rval
from
 @d d join
 (select top (1) with ties id, rval from s order by row_number() over (partition by id order by n desc)) r on r.id = d.id;

select * from @d;
13 ноя 16, 15:47    [19888071]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить одно и тоже поле записи несколько раз при соединении с источником  [new]
anvg
Member

Откуда: СПб
Сообщений: 101
invm, спасибо большое.
С налёта не понял. Буд разбирать.
13 ноя 16, 17:42    [19888281]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить одно и тоже поле записи несколько раз при соединении с источником  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
anvg
С налёта не понял. Буд разбирать.
Читайте про рекурсивное CTE.
13 ноя 16, 18:14    [19888331]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить