如何在一组记录中查找所有记录组中的特定字符串

时间:2014-12-02 17:26:17

标签: sql oracle group-by

不确定如何解决这个问题,这似乎应该很容易。

我需要确定所有未参加某一班级毕业的学生。

使用下面的示例,如果毕业需要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  

4 个答案:

答案 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)为空,只留下错过的连接。