2016-10-04 64 views
0

我在写更新订单价格的触发器时遇到问题。多个行上的sql触发器

我有一个包含order_id和goods_id对的表。 下面是我用于删除的代码片段。其余的基本上是一样的。

CREATE TRIGGER [update_price] 
     ON [dbo].[Goods-Order] 
     AFTER INSERT, DELETE, UPDATE 
    AS  
    BEGIN 
     if (exists(select * from deleted)) 
      UPDATE dbo.Order set order_price -= (input_amount * (select goods_price from dbo.Goods where dbo.Goods.goods_id = deleted.goods_id)) from deleted where dbo.Orde.order_id = deleted.order_id 

的问题是,如果在订单商品表具有相同的order_id多行,更新语句将只处理其中的一个。

我见过一堆堆栈溢出的类似示例,但是,它们有点不同,不适用于我的情况。

我知道有一个解决方案使用游标遍历删除表中的所有行,但我想避免这种方法。可能吗?

回答

2

使用JOIN S表示使表一起:

UPDATE o 
    SET order_price -= d.input_amount * g.goods_price 
    FROM dbo.Order o JOIN 
     deleted d 
     ON o.order_id = d.order_id JOIN 
     dbo.Goods g 
     ON g.goods_id = d.goods_id; 

编辑:

如果Order可以具有相同good多行,然后聚集在加入之前:

UPDATE o 
    SET order_price -= d.input_amount * g.goods_price 
    FROM dbo.Order o JOIN 
     (SELECT d.order_id, d.goods_id, SUM(d.input_amount) as input_amount 
      FROM deleted d 
      GROUP BY d.order_id, d.goods_id 
     ) d 
     ON o.order_id = d.order_id JOIN 
     dbo.Goods g 
     ON g.goods_id = d.goods_id; 
+0

不幸对于具有相同order_id的多行,它仍然不起作用。它只根据其中的一个进行更新。 –