2014-12-02 74 views
1

不知道如何解決這個問題,這似乎應該是很容易的所有組。如何找到一組記錄中的特定字符串,記錄

我需要找出所有所需畢業某一類不招收誰的學生。

使用下面的示例,如果ClassNumber C30是畢業所必需的,我希望查詢返回studentIDs 1和2 - 兩者均未在ClassNumber C30中註冊。

我是否缺少一些簡單的東西?我不確定如何讓SQL來評估studentID分組的記錄集中是否存在字符串ClassNumber

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

使用這一個表,你可以做到這一點作爲一個聚合查詢:

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 
       ); 
0

這不是非常有效的,但一個辦法:

select distinct StudentID from ClassEnrollment 
minus 
select StudentID from ClassEnrollment 
    where ClassNumber = 'C30'; 
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') 
0

標準和最佳表演,方法是使用一個外與在非關鍵條件加盟加盟條件,篩選出成功的加入:

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)爲空只會遺漏連接。

相關問題