2016-10-04 4 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の一緒のテーブルを持って来るために:

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; 

EDIT:その後、

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を持つ複数の行については、まだ動作しません。そのうちの1つに基づいて更新されます。 –

関連する問題