我的存储过程中有一个临时表@table
,如下所示:
AgtID | Bonus
-------------
5063 | 0
1104 | 0
表格bonus
看起来像这样:
AgtID | Contest | Points | Event
--------------------------------
5063 | 21 | 1000 | 1
5063 | 21 | 3000 | 3
1104 | 21 | 1000 | 1
1104 | 21 | 500 | 2
更新查询(当前)如下:
UPDATE tt
SET Bonus = b.Points
FROM @table tt
INNER JOIN tblContestData_Bonus b
ON tt.AgtID = b.AgtID
where ContestID = 21;
目前,当我运行此查询时,它会使用@table.Bonus
中的数据覆盖bonus.Points
中的任何数据。这对于单个记录来说很好,但是当我们开始获得更多奖励积分事件时,我需要让它增加我的价值。
我知道有些语言有i += value
... SQL有类似的东西吗?
答案 0 :(得分:1)
我发布后就知道了。有趣的是如何工作。我做了什么:
UPDATE tt
SET Bonus = coalesce(
(select SUM(Points) as Points
from bonus b
where b.AgtID = tt.AgtID
and ContestID = 21
group by AgtID),0)
FROM @table tt;
即使没有记录,使用coalesce()
在以下步骤中将空值计算到数学也可以正常工作。
答案 1 :(得分:0)
我可能会错过您在此处的内容,但您可以将现有值添加到UPDATE
中的新值:
UPDATE tt
SET Bonus = b.Points + Bonus
FROM @table tt
INNER JOIN tblContestData_Bonus b
ON tt.AgtID = b.AgtID
where ContestID = 21;
答案 2 :(得分:0)
要在SQL中正确执行此操作,您需要预先聚合b
。您无法多次更新单个记录,因此当存在多个匹配项时,update
将不会累积。它只更新(任意)记录。
这样的事情将获得所有奖励积分并将其添加到:
UPDATE tt
SET Bonus = coalesce(tt.Bonus, 0) + b.Points
FROM @table tt INNER JOIN
(select agtId, sum(points) as points
from tblContestData_Bonus b
group by abtId
) b
ON tt.AgtID = b.AgtID
where ContestID = 21;