一尘不染

具有内部联接的SQL Server更新

sql

我有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。

谁能给我一些启示?非常感谢。


阅读 222

收藏
2021-03-17

共1个答案

一尘不染

我的猜测是,因为您已向我们展示了简化的架构,所以缺少一些信息,这些信息将确定为什么对于给定的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,或者应该限制它们的唯一性)

2021-03-17