0

の特定のセルを更新するために、私はこれらの2つのテーブルがあります。トリガーが別のテーブル

dbo.Restaurants(rid,name,phone,area,address,zip,desc,foodtype,avgRating) 

dbo.Reviews(rev_id,rest_id,user_id,taste, service,environment,value,average,comment) 

を私はこれを行うトリガーを作成しようとしてきた: ときに行dbo.Reviewsが削除、更新、または挿入された場合、トリガーはレストランの新しい平均評価を次のように計算します。

select rid, round(avg(average)*20,0) as 'average' 
from dbo.Restaurants inner join dbo.Reviews on rid=rest_id 
group by rid 

そしてdbo.RestaurantsのavgRatingセルを更新します(dbo.Restaurants.rid = dbo.Reviews.rest_id)。これまでのところ、私はこれを作ってみた

:明らかに動作しません

CREATE TRIGGER [defAverage] 
ON [dbo].[Reviews] 
AFTER UPDATE, DELETE, INSERT 
AS 
BEGIN 

select rid, round(avg(average)*20,0) as 'average' 
from Restaurants inner join Reviews on rid=rest_id 
group by rid 
order by 'average' desc 
    SET NOCOUNT ON 
    UPDATE [dbo].[Restaurants] 
    SET [dbo].[Restaurants].avgRating = 'average' 
    where [dbo].[Reviews].rest_id = [dbo].[Restaurants].rid 

END 

、そう私はここではないでしょう。 私はSQL Server Tools 2012を使用するVisual Studio Ultimate 2013を使用しています。

お時間とご提案をいただきありがとうございます。

答えて

2

deletedの2つの疑似表があり、DMLトリガーでのみ使用できます。明らかな理由により、deleteの場合にはinsertedテーブルが空であり、insertの場合にはdeletedが空であり、updateの場合には、両方のテーブルが設定される。また、トリガーでそれらを使用することもできます。

CREATE TRIGGER [defAverage] 
ON [dbo].[Reviews] 
AFTER UPDATE, DELETE, INSERT 
AS 
BEGIN 

SET NOCOUNT ON 
UPDATE [dbo].[Restaurants] 
    SET avgRating = round(avg(rv.average)*20,0) 
from Restaurants r inner join Reviews rv on r.rid=rv.rest_id 
where r.rid in (select rest_id from inserted 
       union 
       select rest_id from deleted) 
group by r.rid 

END 
関連する問題