2016-08-20 43 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 *个订单的总计。任何未能使用“插入”或“删除”的触发器(如此处)可能已经被打破。 –

相关问题