2016-08-20 64 views
0

我有兩個表Order和Order_Details。我想創建一個觸發器,通過添加屬於該特定順序的Order_Details.Price字段來更新Order.Order_Total。這是我迄今爲止,但它給了我以下錯誤 子查詢返回多個值。當子查詢遵循時,這是不允許的創建一個觸發器更新表中的一個字段從另一個表中的行項目總數

Update Order 
Set Order_Total = 
    (Select SUM(Price) 
    From Order_Details 
    Group By Order_Id) 
From Order_Details 
+0

通常最好不要*存儲*可以計算*的*。除非性能至關重要,否則您所做的所有工作都會爲計算出的值帶來與現實不同步的機會(例如,有人會阻止您的觸發器暫時運行)。而如果您在數據檢索期間進行計算,則您知道生成的值與其餘數據一致。 –

回答

0

試試這個問題是在你的子查詢中沒有任何與訂單表的綁定。

UPDATE o 
    SET o.Order_Total = t.tprice 
FROM Order o 
      LEFT JOIN (SELECT Order_Id, SUM(isnull(price,0)) tprice 
           FROM OrderDetails 
           GROUP BY Order_Id) t 
         ON o.Order_Id=t.Order_Id 
0

好吧,這是我最終做的事情,以防萬一有人有同樣的問題。我創建了一個CTE來添加Order_Details價格,並且我從CTE更新了Order.Total。這是我使用的完整代碼。

IF EXISTS (SELECT 1 FROM sys.triggers WHERE object_id = object_id('dbo.trOrder_Details_AIU')) 
    DROP TRIGGER dbo.trOrder_Details_AIU 
GO 

CREATE TRIGGER dbo.trOrder_Details_AIU 
    ON dbo.Order_Details 
    AFTER INSERT,UPDATE, Delete 
AS 
BEGIN 
    set nocount on; 
    begin 
    ; with Total_CTE(Order_Id, Total) 
    as 
    ( 
     Select Order_Id, SUM(Price) 
     From Order_Details 
      Group By Order_Id 
    ) 

Update Order 
Set Order_Total = Total_CTE.Amount 
From Total_CTE 
Where Total_CTE.Order_Id = Total.Order_Id 
    end 
END 
+0

這不會很好地擴展。即使某個特定語句只涉及單個訂單,您也正在重新計算* all *個訂單的總計。任何未能使用「插入」或「刪除」的觸發器(如此處)可能已經被打破。 –