我有一个临时表 a ,其中包含idproduct,数量与
相似idproduct Qty
123 2
123 2
和 b 一样
idproduct stock
123 10
然后我要更新(b.stock-a.qty) 所以我想要像
这样的结果idproduct stock
123 6
但它让我很喜欢
**idproduct stock
123 8**
来自评论:
UPDATE INV
SET INV.stock = isnull(INV.stock,0) - ISNULL(TEMP.QTY,0)
FROM INVENTORY INV, #TempBagPack TEMP
WHERE INV.idproduct = TEMP.idproduct
答案 0 :(得分:0)
首先。 从不在FROM
子句中使用逗号。 始终使用明确的JOIN
语法。
其次,您的问题是多行匹配更新,但SQL Server仅更新行一次。这是有据可查的。
解决方案是预先汇总数据:
update i
set i.stock = coalesce(i.stock, 0) - coalesce(t.qty, 0)
from inventory i join
(select idproduct, sum(qty) as qty
from #TempBagPack t
group by idproduct
) t
on i.idproduct = t.idproduct;
documentation中的警告是:
指定FROM子句以提供条件时要小心 用于更新操作。 UPDATE语句的结果是 如果语句包含不是的FROM子句,则为undefined 以这样的方式指定,每个只有一个值可用 更新的列出现,即UPDATE语句是否 不确定。
答案 1 :(得分:0)
@Gordon Linoff明确提到了您的查询中的问题。
这只是使用CTE编写脚本的另一种方式。
;with cte_1
As
(select idproduct, sum(qty) as qty
from #TempBagPack t
group by idproduct
)
update i
set i.stock = coalesce(i.stock, 0) - coalesce(t.qty, 0)
from Cte_1 t
Join inventory i
on i.idproduct = t.idproduct;