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 

這顯然是不行的,否則我就不會在這裏。 我使用Visual Studio Ultimate 2013,它使用SQL Server Tools 2012.

在此先感謝您的時間和建議。

回答

2

有兩個名爲inserteddeleted的僞表,僅在DML觸發器中可用。 inserted由於顯而易見的原因在delete的情況下爲空,在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 
相關問題