有两个表:
学生(studentid, LName, FName, GPA)
注册(注册号、课程编号、学期、年级)
我想创建一个触发器,每次添加新成绩时更新GPA,计算如下gpa = (old.gpa + new.grade)/count(grade) where studentid = new.studentid
这是我的代码,但它不会工作
Create trigger [dbo].[stud_marks]
on
[dbo].[enroll]
after INSERT,update
AS
DECLARE @id as int
DECLARE @newgrade as int
SELECT @id = studentid, @newgrade = grade
FROM inserted
begin
UPDATE students
set gpa = (gpa + @newgrade)/count(@id)
end
显示错误:
Msg 157, Level 15, State 1, Procedure stud_marks, Line 16 [Batch Start Line 7]
An aggregate may not appear in the set list of an UPDATE statement.
正如其他人所说,这不是一个好主意,不是3NF,并且会导致不一致的数据。这些都是不好的事情,不要去做。
话虽这么说,问题不在于你的触发器,而在于你的UPDATE。
你没有限制对特定学生的更新,并且你试图在更新中执行聚合,这是不允许的。这是你的更新应该看起来的样子,我是用老屁的方式实现的,没有使用WITH,但是a)我是一个老屁,b)你把我从看我的"matlock"中带走了;写这篇文章很辛苦。无论如何,这是你应该写的更新。
UPDATE students
set gpa = (select avg(grade) + @newgrade from enroll where studentid=@id)
/(select count(*)+1 from enroll where studentid=@id )
where studentid=@id
好吧,现在我又要回去做那些老掉牙的事了。如果你们中的任何一个自以为是的人给我一个"好吧,婴儿潮一代",只要记住——我会开手动变速器。