2012-11-06 103 views
0

我正在嘗試創建一個觸發器,它將使用在OrderDetail表中找到的訂單信息更新我的訂單表。詳細信息表可以按順序包含多個項目的多個行。這些通過OrderID鏈接在一起。我到目前爲止是:觸發更新表

CREATE TRIGGER AfterOrderDetailInsert ON OrderDetail 
AFTER INSERT AS 
UPDATE Orders 
SET OrderTotal = (
    SELECT (
     SELECT Sum(orderdetail.quantity * OrderDetail.Price * 
      (1.0 -OrderDetail.ItemDiscount/100.0) 
     ) 
     FROM orderdetail 
     WHERE OrderDetail.OrderId = Orders.OrderId 
    ) * 
    (1 - Orders.OrderDiscount/100.0) * 
    (1.0 - Orders.CustomerDiscount/100.0)  
    FROM OrderDetail 
    INNER JOIN Orders on OrderDetail.OrderID=Orders.OrderID 
    WHERE OrderDetail.OrderID IN (SELECT OrderID FROM Inserted) 
) 

我收到一個錯誤,現在說子查詢返回的值超過1。這不應該只是返回一個單一的總價值?我已經嘗試添加SUM,以便它的UPDATE Orders Set OrderTotal = SUM(SELECT(SELECT OrderTotal Stuff)),但是在第一個SELECT之前給我一個語法錯誤。

這是SQL Server上2000

編輯:我已經改變了查詢後插入,因爲我想的OrderTotal任何插入後更新

第二編輯:我想包括插入的元表,因爲它應該包含最新插入行的順序ID,並且一次只能插入一行。現在,雖然我收到一條錯誤消息,提示「密鑰列信息不足或不正確,太多的行受到更新的影響」。並查看訂單總額列,我的表中的每一行都會更新該訂單總額。所以我覺得我很接近,但我仍然錯過了一些東西。

回答

3

好的,終於明白了。訣竅結束了使用inserted表中的訂單ID爲海內外訂單ID查詢和更新查詢中被引用,所以我最終的查詢是這樣的:

CREATE TRIGGER AfterOrderDetailInsert ON OrderDetail 
AFTER INSERT AS 
UPDATE Orders 
SET OrderTotal = (
SELECT (
    SELECT Sum(orderdetail.quantity * OrderDetail.Price * 
     (1.0 -OrderDetail.ItemDiscount/100.0) 
    ) 
    FROM orderdetail 
    WHERE OrderDetail.OrderId = Orders.OrderId AND OrderDetail.OrderID in 
    (SELECT TOP 1 OrderID From Inserted)) * 
(1 - Orders.OrderDiscount/100.0) * 
(1.0 - Orders.CustomerDiscount/100.0)  
FROM OrderDetail 
INNER JOIN Orders on OrderDetail.OrderID=Orders.OrderID 
INNER JOIN INSERTED on Orders.OrderID=Inserted.OrderID 
) WHERE Orders.OrderID IN (SELECT TOP 1 OrderID FROM Inserted) 

的主要區別是,我從來沒有設置任何條件的更新子句,因爲我將它與SELECT查詢的條件混合在一起。