我有3张桌子(简体):
tblOrder(OrderId INT)
tblVariety(VarietyId INT,Stock INT)
tblOrderItem(OrderId,VarietyId,Quantity INT)
如果下订单,则使用以下命令降低库存水平:
UPDATE tblVariety
SET tblVariety.Stock = tblVariety.Stock - tblOrderItem.Quantity
FROM tblVariety
INNER JOIN tblOrderItem ON tblVariety.VarietyId = tblOrderItem.VarietyId
INNER JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId
WHERE tblOrder.OrderId = 1
一切正常,直到tblOrderItem中有两行具有相同OrderID的相同VarietyId。在这种情况下,只有一行用于库存更新。它似乎在那里以某种方式执行GROUP BY VarietyId。
谁能阐明一些想法?非常感谢。
最佳答案
我的猜测是,因为您已向我们展示了简化的架构,所以缺少一些信息,这些信息将确定为什么对于给定的OrderID具有重复的VarietyID值。
当您有多行时,SQL Server会随意选择其中之一进行更新。
在这种情况下,您需要先分组
UPDATE V
SET
Stock = Stock - foo.SumQuantity
FROM
tblVariety V
JOIN
(SELECT SUM(Quantity) AS SumQuantity, VarietyID
FROM tblOrderItem
JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId
WHERE tblOrder.OrderId = 1
GROUP BY VarietyID
) foo ON V.VarietyId = foo.VarietyId
如果不是,那么OrderItems表PK是错误的,因为如果允许重复的OrderID / VarietyID组合(PK应该是OrderID / VarietyID,或者应该限制为唯一)