sql - 将新成绩添加到数据库时,Microsoft sql 会触发自动更新 GPA
问题描述
有2张桌子:
学生(学生,LName,FName,GPA)
Enroll(enrollid, CourseID, Semester, Grade)
我想创建一个触发器,每次添加新成绩时更新 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
好吧,现在我得回去做些老放屁的事情了。如果你们中的任何一个鞭打者给我一个“好的,布默”,请记住——我可以操作手动变速器。
推荐阅读
- java - Corda :Corda 中的响应者流注解 @InitiatedBy 显示不兼容的类型错误
- java - 如何创建一个从 Activity 更新 TextView 的计时器,以及当应用程序进入后台时它会继续运行
- python - 按字符串名称执行函数
- c# - 通过从 json 文件中提供应用程序 ID 和密码来进行机器人身份验证
- c - C fopen 是否将整个文件读入内存?
- python - 使用特征张量复制 TensorFlow 的 Conv2D 操作
- javascript - 从数组中获取时间差
- python - 从python中的csv文件中删除\r\n
- jenkins - 有没有办法从 Bamboo 触发 Jenkins 构建?
- html - 如何在 Internet Explorer 中显示嵌入的 PDF?