我正在开发一些MySQL,遇到了一些问题。
我试图用一个学生获得的正确学分来更新一个列,但是现在当我计算得到的学分时,我得到了所有学生获得的学分总数。我
学生桌
ID varchar(5)
name varchar(20)
dept_name varchar(20)
tot_cred decimal(3,0)
坐在桌子上
ID varchar(5)
course_id varchar(8)
sec_id varchar(8)
semester varchar(6)
year decimal(4,0)
grade varchar(2)
课程表
course_id varchar(8)
title varchar(50)
dept_name varchar(20)
credits decimal(2,0)
这是我目前正在使用的声明。我还必须添加
if they have an f then they don't get credit for the class that they took
update studentCopy set tot_cred = (
select sum(course.credits)
from student
left join takes on student.ID = takes.ID
left join course on takes.course_id = course.course_id
where student.ID = student.ID
group by studentCopy.ID);
任何帮助都将不胜感激。提前谢谢!
最佳答案
以下是对查询的一些简化:left join
s是不必要的。您只需使用join
。group by
是不必要的。实际上,这是一种误导,因为它表明子查询可能返回多行(这将产生错误)。Student
表是不必要的;您可以将correlation子句目录写入takes
。
表别名使查询更易于编写和读取。
所以,我会把你的问题写成:
update studentCopy sc
set tot_cred = (select sum(c.credits)
from takes t join
course c
on t.course_id = c.course_id
where sc.ID = t.ID
);
您可以在
where
子句中添加分数条件:update studentCopy sc
set tot_cred = (select sum(c.credits)
from takes t join
course c
on t.course_id = c.course_id
where sc.ID = t.ID and grade <> 'f'
);