ОБНОВЛЕНИЕ T-SQL с использованием самостоятельного соединения для табличной переменной - PullRequest
4 голосов
/ 19 апреля 2011

Представьте, что есть таблица:

declare @tab table (id int, val int)
insert into @tab(id, val)
values (1,10),(2,20),(1,15)

необходимо обновить таблицу и установить для каждого идентификатора сумму всех значений с одинаковыми идентификаторами в таблице

update @tab
set val = (select sum(val) from @tab tab where tab.id = id)

Предложение where последнего запроса всегда истинно, и поэтому каждая строка будет содержать сумму всех значений в таблице.

Если бы таблица была реальной (не переменной таблицы), я бы сослался на нее, используя имя таблицы:

update realtab
set val = (select sum(val) from @tab tab where tab.id = realtab.id)

Можно ли сделать такое обновление для табличных переменных?

Ответы [ 2 ]

5 голосов
/ 19 апреля 2011

Попробуйте использовать ОБНОВЛЕНИЕ ... ОТ

update t
set val = (select sum(val) from @tab tab where tab.id = t.id)
FROM @tab t
1 голос
/ 19 апреля 2011
UPDATE  realtab
SET     val = (select sum(val) from @tab tab where tab.id = realtab.id)
FROM    @tab realtab

Вы также можете использовать CTE:

WITH    q AS
        (
        SELECT  *,
                SUM(val) OVER (PARTITION BY id) AS sum_val
        FROM    @tab
        )
UPDATE  q
SET     val = sum_val
...