2

为了解释这个问题,我刚刚在下面概述了一个示例情况。

OrderRows

ID|OrderNumber|ProductNumber|Quantity|Done
1 |10         |100          |1       |no*
2 |10         |101          |1       |no
3 |10         |100          |4       |no*

*具有相同的产品编号

Stock
ProductNumber|Quantity
100          |5
101          |1

UPDATE OrderRows 
INNER JOIN Stock ON Stock.ProductNumber=OrderRows.ProductNumber 
SET Done='yes'
   ,Stock. Quantity = Stock. Quantity -OrderRows. Quantity 
WHERE OrderNumber='100' AND Done='no'

该表的结果Stock将如下所示。

ProductNumber|Quantity
100          |4
101          |0

订单行已正确更新。但是对于第三行,Stock 没有被调整。这是因为第三行订单的产品编号与第一行订单相同。问题是,我该如何解决这个问题?

4

1 回答 1

0

你需要在GROUP BY这里使用。但是我们不能直接使用它。所以你可以使用这样的子查询来实现这一点:

UPDATE OrderRows o
  JOIN Stock s
    ON s.ProductNumber = o.ProductNumber
  JOIN 
     (
       SELECT ProductNumber, SUM(Quantity) AS Quantity
         FROM OrderRows 
        WHERE  Done = 'no'
        GROUP BY ProductNumber
     ) o1
   ON o.ProductNumber = o1.ProductNumber
  SET o.Done = 'Yes'
     ,s.Quantity = s.Quantity - o1.Quantity
 WHERE o.Done = 'no';

更新后的表格:

订单行

| ID | ORDERNUMBER | PRODUCTNUMBER | QUANTITY | DONE |
------------------------------------------------------
|  1 |          10 |           100 |        1 |  Yes |
|  2 |          10 |           101 |        1 |  Yes |
|  3 |          10 |           100 |        4 |  Yes |

库存

| PRODUCTNUMBER | QUANTITY |
----------------------------
|           100 |        0 |
|           101 |        0 |

看到这个 SQLFiddle

于 2013-08-07T10:06:50.593 回答