2014-12-02 1 views
1

Не знаете, как решить эту проблему, которая кажется, что это должно быть легко.Как найти определенную строку в группе записей для всех групп записей

Мне нужно идентифицировать всех студентов, которые не зарегистрированы в определенном классе, который требуется для окончания.

Используя приведенный ниже пример, если для окончания требуется ClassNumber C30, я хочу, чтобы запрос возвращал studentIDs 1 и 2 - ни один из них не зарегистрирован в ClassNumber C30.

Я пропустил что-то простое? Я не уверен, как получить SQL для оценки наличия или отсутствия строки в 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

Используя эту одну таблицу, вы можете сделать это в качестве запроса агрегации:

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 

Это работает, потому что пропустил присоединяется есть все нули в строке, и в то время как условие соединения применяется во время объединения, где положение применяется после в join, поэтому указывая, что объединенный столбец (который фактически не может быть null) имеет значение null оставляет только пропущенные объединения.

Смежные вопросы