我假设以下初始数据: 产品:
PRODUCTID QUANTITY
1 10
2 210
3 0
购物车:
CARTID PRODUCTID QUANTITY DATEADDED
21 1 3 2012-11-20
24 1 1 2012-11-19
22 2 2 2012-11-25
23 3 3 2012-11-20
你会得到以下输出:
产品:
PRODUCTID QUANTITY
1 14
2 210
3 3
发生的情况是,对于 Products 中的每一行,Quantity 都被更新了“x”次,其中“x”是 ShoppingCart 中匹配的行数。但是,在每次迭代中,“Products.Quantity”持有的值是初始值,因此最终结果只是将 Products.Quantity 中的初始值加上 ShoppingCart 中最后匹配记录的 Quantity 值。
例如,在上面的数据集中,产品 1 的数据库中会发生以下等效操作:
UPDATE Products SET Quantity = 10 + 1 WHERE ProductId = 1;
UPDATE Products SET Quantity = 10 + 3 WHERE ProductId = 1;
所以最终值是 13,而不是您期望的 14。基本上,在 INNER JOIN 中评估的最后一行获胜,其余的最终被有效地忽略。
为了解决这个问题,您需要在执行 set 命令之前聚合数据。我相信以下会解决问题。我在内联视图中汇总每个产品的所有过期数量,然后使用该值进行更新:
UPDATE Products
SET Products.Quantity = Products.Quantity + Expired.Quantity
FROM Products
INNER JOIN (SELECT S.ProductId, SUM(S.Quantity) AS Quantity
FROM ShoppingCart S
WHERE S.DateAdded < GETDATE()- 7
GROUP BY S.ProductId) AS Expired
ON Expired.ProductID = Products.ProductID
我使用SQL Fiddle来测试它。