SQL查询查找每个课程都收到A的学生

时间:2016-10-22 22:49:02

标签: sql oracle

我有以下架构:

学生(sid,名字,姓氏,状态,gpa,电子邮件)

课程(dept_code,课程#,标题)

类(classid,dept_code,course#,sect#,year,semester,limit,class_size)

注册(sid,classid,lgrade)

我需要一些帮助才能找到所有参加过每门课程的学生。

4 个答案:

答案 0 :(得分:1)

我可能会建议使用聚合:

select e.sid
from enrollement e
group by e.sid
having min(lgrade) = max(lgrade) and min(lgrade) = 'A';

答案 1 :(得分:1)

尽量不要过度思考:

SELECT s.*
  FROM STUDENTS s
  WHERE s.GPA = 4.0

这适用于A = 4,B = 3,C = 2,D = 1,F = 0的情况(标准美国评分系统)。

对于非标准系统(例如我的孩子高中,其中A = 5代表荣誉和高级安置课程),我们不能信任GPA:

SELECT s.*
  FROM STUDENTS s
  INNER JOIN (SELECT SID, COUNT(*) AS CLASS_COUNT
                FROM ENROLLMENTS
                GROUP BY SID) cc
  INNER JOIN (SELECT SID, COUNT(*) AS A_GRADE_COUNT
                FROM ENROLLMENTS
                WHERE LGRADE = 'A'
                GROUP BY SID) ag
    ON ag.SID = s.SID
  WHERE CLASS_COUNT = A_GRADE_COUNT

祝你好运。

答案 2 :(得分:0)

试试这个

select * from students 
where sid not in (select distinct sid from enrollement where coalesce (lgrade,'X') <> 'A')

这意味着:带走所有学生,除了A之外,他/她的成绩都不是 如果你想获得课程和课程的名称,你也必须加入两个表

答案 3 :(得分:0)

我认为这是最清楚的:

select e.sid
from enrollement e
group by e.sid
having count(case when lgrade = 'A' then 1 else 0 end) = count(*) and count(*) > 0