不确定如何解决这个问题,这似乎应该很容易。
我需要确定所有未参加某一班级毕业的学生。
使用下面的示例,如果毕业需要ClassNumber
C30,我希望查询返回studentIDs
1和2 - 他们都没有在ClassNumber
C30中注册。
我错过了一些简单的东西吗?我不确定如何在ClassNumber
分组的一组记录中的studentID
中评估字符串是否存在。
ClassEnrollment Table
=====================
ID|ClassNumber|StudentID
1 |A10 |1
2 |A10 |1
3 |B20 |1
4 |A10 |2
5 |B20 |2
6 |B20 |2
7 |C30 |3
8 |A10 |3
9 |A10 |3
答案 0 :(得分:0)
使用这一个表,您可以将其作为聚合查询:
select StudentId
from ClassEnrollment
group by StudentId
having sum(case when ClassNumber = 'C30' then 1 else 0 end) = 0;
如果您有另一个学生表,我认为更自然的方式是使用not exists
:
select StudentId
from Students s
where not exists (select 1
from ClassEnrollment ce
where ClassNumber = 'C30' and ce.StudentId = s.StudentId
);
答案 1 :(得分:0)
这不是非常有效,但有一种方式:
select distinct StudentID from ClassEnrollment
minus
select StudentID from ClassEnrollment
where ClassNumber = 'C30';
答案 2 :(得分:0)
另一种方法:
select distinct ce.StudentID from ClassEnrollment ce
where not exists (select 1 from ClassEnrollment ce2 where ce2.StudentID = ce.StudentID and ce2.ClassNumber = 'C30')
答案 3 :(得分:0)
标准且性能最佳的方法是在 join 条件中使用具有非键条件的外连接,过滤掉成功的连接:
select s.*
from Student s
left join ClassEnrollment e
on e.StudentID = s.Id
and e.ClassNumber = 'C30'
where e.StudentID is null
这是有效的,因为错过的连接在行中具有所有空值,并且在连接期间应用连接条件时,在连接之后应用的where子句,因此指定一个连接列(实际上可以为null)为空,只留下错过的连接。