多行上的sql触发器

时间:2016-10-04 10:51:03

标签: sql sql-server tsql triggers

我在编写更新订单价格的触发器时遇到问题。

我有一个包含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-Goods表中有多个行具有相同的order_id,则update语句将只处理其中一个。

我在堆栈溢出时看到了一些类似的例子,但是,它们有点不同,并不适用于我的情况。

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

1 个答案:

答案 0 :(得分:2)

使用JOIN将表格组合在一起:

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;