我在编写更新订单价格的触发器时遇到问题。
我有一个包含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语句将只处理其中一个。
我在堆栈溢出时看到了一些类似的例子,但是,它们有点不同,并不适用于我的情况。
我知道有一个解决方案使用游标迭代删除表中的所有行,但我想避免这种方法。可能吗?
答案 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;