2012-11-28 39 views
-1
UPDATE Products 
SET Products.Quantity = Products.Quantity + ShoppingCart.Quantity 
FROM Products INNER JOIN ShoppingCart 
    ON ShoppingCart.ProductID = Products.ProductID 
WHERE ShoppingCart.DateAdded < GETDATE()- 7 
DELETE FROM ShoppingCart 
WHERE DateAdded < GETDATE()- 7 

与此查询需要做好这项工作:这是在我的购物补充说,年纪大了,然后7天为被删除,其数量要返回到该产品的可用数量如何使用另一个表中的值更新表中的多个行?

产品出售。但问题在于,只有第一个产品的数量才会添加到Products.Quantity字段中。他们的其余部分不计,并重新添加到产品表..

+0

尝试添加一些示例数据以显示您期望发生的事情。它可能会让那些压低你问题的用户更清楚。 –

回答

0

我假设如下初始数据: 产品:

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 

发生什么事情是,对于产品中的每一行,数量正在更新“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来进行测试。

相关问题