我遇到了更新触发器的问题。我希望触发器将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
子句中的表时,我都会收到同样的错误。我该如何解决这个问题?
答案 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
在您最初的尝试中,您希望首先使用SELECT
查询来填充标量变量。但是,在UPDATE
语句中,您可以使用一个子选择,该子选择只返回SET
子句中恰好一行的一列,以检索新值。
由于您的要求是使用汇总SUM()
,因此不像直接从inserted
SET Yards = inserted.Yards
分配值那样简单明了。相反,子选择产生的总和仅限于Team
行中使用的inserted
。
至于inserted/deleted
表格,review the official documentation。我没有定期使用SQL Server几年,但如果我没记错,inserted
表必须出现在FROM
子句中,这意味着它通常需要JOIN
在您的UPDATE
语句中,子查询和外部查询都需要inserted
,因此它在外部查询中加入。