2010-08-12 76 views
25

我有3個表(簡體):SQL服務器更新加入

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。

任何人都可以點亮一下嗎?非常感謝。

+0

應該不可能有相同的品種/訂購組合? 也就是說,如果一個訂單的同一品種出現大於1,那麼這是在數量列中捕獲的,而不是多行? – gbn 2010-08-12 13:19:15

+0

技術上,是的。但也有其他列tblOrderItem這意味着多條線可以進入這些相同的基本數字(例如日期字段) – Geoff 2010-08-12 13:29:11

回答

43

我的猜測是,因爲你已經向我們展示了簡化模式,所以缺少一些信息,這將確定爲什麼具有給定OrderID的重複VarietyID值。

當您有多個行時,SQL Server將arbritrarily選擇其中一個進行更新。

如果是這樣的話,你需要組第一

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應該是訂單ID/VarietyID,或這些都應該被約束是唯一的)

+0

非常感謝gbn - 這對我來說... – Geoff 2010-08-12 13:46:21

+0

+1工作它所有的辦法。 – Tobiasopdenbrouw 2010-08-12 13:49:29

+1

+100 @gbn我欠你一杯啤酒。 – 2013-04-10 04:53:19

1

您正在更新。它會更新一次。

編輯:爲了解決,你可以添加一個子查詢,它將你的訂單項由orderid和varietyid分組在一起,並與金額相加。

12

從文檔UPDATE

UPDATE語句的結果是 未定義如果語句包括一 來自未在 這樣一種方式,只有一個值是 可用於每個列發生 被更新指定條款(換言之,如果 UPDATE語句不是 確定性)。例如,給出以下 腳本 UPDATE語句,在表S =兩行滿足FROM子句 資格在 UPDATE語句,但它是 不確定它從s行用來 更新的行在表t中。

CREATE TABLE s (ColA INT, ColB DECIMAL(10,3)) 
GO 
CREATE TABLE t (ColA INT PRIMARY KEY, ColB DECIMAL(10,3)) 
GO 
INSERT INTO s VALUES(1, 10.0) 
INSERT INTO s VALUES(1, 20.0) 
INSERT INTO t VALUES(1, 0.0) 
GO 
UPDATE t 
SET t.ColB = t.ColB + s.ColB 
FROM t INNER JOIN s ON (t.ColA = s.ColA) 
GO