【问题标题】:Trigger to update specific cell of another table触发更新另一个表的特定单元格
【发布时间】:2016-11-10 03:59:12
【问题描述】:

我有这两张桌子:

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。

提前感谢您的时间和建议。

【问题讨论】:

    标签: sql-server visual-studio visual-studio-2013 triggers sql-server-2012


    【解决方案1】:

    有两个名为 inserteddeleted 的伪表仅在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多