2012-11-28 60 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來進行測試。

相關問題