选择在所有考试中获得A的学生的信息



我有三个表:

STUDENT
Studentid (pk) | Lastname | Firstname
SUBJECT
Subjectcode (pk) | Subjectyear (pk) | Subjectname
EXAM
Studentid (pk, fk) | Subjectcode (pk, fk) | Subjectyear(pk, fk) | Grade

我需要做一个选择声明,返回所有在科目考试中只获得a级的学生的Studentid、Lastname和Firstname。所以,假设一个特定的学生参加了三门不同科目的考试,得了a、B和a,那么他们就不应该被包括在成绩中。如果另一名学生在两门不同的科目中进行了两次考试,并获得了A和A,则必须将其计入成绩中。

一个选项是聚合:

select st.studendid, st.lastname, st.firstname
from student st
inner join exam ex on ex.studendid = st.studendid
group by st.studendid, st.lastname, st.firstname
having min(ex.grade) = max(ex.grade) and min(ex.grade) = 'A'

实际上,假设'A'按字母顺序是最低级别的,having子句可以简化为:

having max(ex.grade) = 'A'

请注意,您不需要subject表来获得您要查找的结果。

假设所有学生至少有一次考试,那么您可以使用NOT EXISTS:

select s.* from student s
where not exists (
select 1 from exam
where studentid = s.studentid and grade <> 'A'
)

最新更新