我有以下架构:
学生(sid,名字,姓氏,状态,gpa,电子邮件)
课程(dept_code,课程#,标题)
类(classid,dept_code,course#,sect#,year,semester,limit,class_size)
注册(sid,classid,lgrade)
我需要一些帮助才能找到所有参加过每门课程的学生。
答案 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