AFTER UPDATE触发器使用更新表中的聚合

时间:2013-12-19 02:25:17

标签: sql sql-server select triggers

我遇到了更新触发器的问题。我希望触发器将Quarterbacks.Yards设置为等于宽接收码的总和,如果他们在同一个团队中。

create trigger T_Receiving_Passing
on NFL.Widereceivers
after update
as
begin
declare
@receivingyards int,

select @receivingyards = sum (Widereceivers.Yards) from NFL.Widereceivers
update NFL.Quarterbacks
set Quarterbacks.Yards = @receivingyards
where Quarterbacks.Team = Widereceivers.Team
end

在声明的最后,Widereceivers.Team带有红色下划线,表示错误。每当我尝试引用另一个表中的列而不命名from子句中的表时,我都会收到同样的错误。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

好的,您应该能够在没有SELECT语句或其变量的情况下执行此操作,而是使用更复杂的UPDATE语句加入包含新值的特殊inserted表来自更新。

CREATE TRIGGER T_Receiving_Passing
ON NFL.Widereceivers
AFTER UPDATE
AS
  UPDATE NFL.Quarterbacks
  -- Get the SUM() in a subselect
  SET Quarterbacks.Yards = (SELECT SUM(Yards) FROM Widereceivers WHERE Team = inserted.Team) 
  FROM 
    NFL.Quarterbacks
    -- Join against the special inserted table
    JOIN inserted ON Quarterbacks.Team = inserted.Team
GO

Here is a proof of concept

在您最初的尝试中,您希望首先使用SELECT查询来填充标量变量。但是,在UPDATE语句中,您可以使用一个子选择,该子选择只返回SET子句中恰好一行的一列,以检索新值。

由于您的要求是使用汇总SUM(),因此不像直接从inserted SET Yards = inserted.Yards分配值那样简单明了。相反,子选择产生的总和仅限于Team行中使用的inserted

至于inserted/deleted表格,review the official documentation。我没有定期使用SQL Server几年,但如果我没记错,inserted表必须出现在FROM子句中,这意味着它通常需要JOIN在您的UPDATE语句中,子查询和外部查询都需要inserted,因此它在外部查询中加入。