2013-04-23 4 views
1

Я пытаюсь перечислить студентов, которые были зачислены, по крайней мере, на один курс в Fall квартал или по крайней мере один курс в весенний квартал, но не оба. Я попытался пойти на это под разными углами, но до сих пор мне не удалось ни с кем из них. Код, который, как я чувствую, завершает это решение, будет следующим. Любая помощь приветствуется!Где либо или нет оба предложения SQL

SELECT enrolled.StudentID, student.LastName, student.FirstName 
    , enrolled.courseID, enrolled.Quarter 
FROM enrolled 
INNER JOIN student ON enrolled.studentID = student.SID 
GROUP BY enrolled.StudentID, student.LastName, student.FirstName 
    , enrolled.courseID, enrolled.Quarter 
HAVING (count(distinct enrolled.Quarter) = 1) 
+1

Если вы удаляете зарегистрированную группу. Группа из группы Alone, для неправильной группы указывается ошибка. Если я удалил enrolled.Quarter из SELECT также поверх GroupBy, я все равно получаю все строки. –

ответ

0

комментарий Stouny был правильным, удаление quarter из group by и использования агрегатор в select будет работать:

SELECT enrolled.StudentID, student.LastName, student.FirstName, enrolled.courseID, max(enrolled.Quarter) as quarter 
FROM enrolled 
INNER JOIN student ON enrolled.studentID = student.SID 
GROUP BY enrolled.StudentID, student.LastName, student.FirstName, enrolled.courseID 
HAVING count(*) = 1 

Другой подход, который не будет масштабироваться хорошо, если у вас есть много кварталов, чтобы проверить, но работает ok for 2:

SELECT enrolled.StudentID, student.LastName, student.FirstName, coalesce(spring.courseID, fall.courseID), coaleasce(spring.Quarter, fall.quarter) 
FROM students 
LEFT OUTER JOIN enrolled as spring ON spring.studentId = students.sid and spring.quarter = 'spring' 
LEFT OUTER JOIN enrolled as fall ON fall.studentId = students.sid and fall.quarter = 'fall' 
WHERE (spring.courseID != NULL and fall.courseID = NULL) OR (spring.courseID ! NULL and fall.courseID != NULL) 
+0

Предложение Patricks работает и для того, насколько мала моя база данных, нет никаких осложнений –

0

Вы могли бы использовать что-то по следующим направлениям:

SELECT 
    enrolled.StudentID, student.LastName, 
    student.FirstName, enrolled.courseID, enrolled.Quarter 
FROM enrolled 
where StudentID in ( 
    SELECT StudentID 
    FROM enrolled where quarter in ('fall', 'spring') 
    group by StudentID 
    having count(*) = 1 
    )  
+0

Этот метод похож на первый способ, которым я пытался завершить это. Код потребовал немного очистки, когда дело дошло до ученика.LastName, student.FirstName, но он дает мне мой желаемый ответ. Спасибо –

0

К сожалению на мой телефон так не будет полный ответ.

Я хотел бы попробовать

Select [what you want] 
From students as s 
Outer apply 
(
Select distinct sid 
From enrolled as e 
Where e.sid =s.sid 
And quorter = 1 
) as q1 
Outer apply 
(
Select distinct sid 
From enrolled as e 
Where e.sid =s.sid 
And quorter = 2 
) as q2 
Where 
(( q1.sid is null and q2.sid is not null) 
Or 
(q1.sid is not null and q2.sid is null)) 
And (q1.sid is not null and q2.sid is not null) 
+0

Спасибо за очистку, я отформатировал его, но когда я нажал кнопку submit, был взломан. – workabyte

0

Я хотел бы сделать запрос союза.

select yourfields 
from enrolled 
where studentid in 
(select studentid 
from enrolled 
where quarter = 'fall' 
minus 
select studentid 
from enrolled 
where quarter = 'spring') 

union all 
select yourfields 
from enrolled 
where studentid in 
(select studentid 
from enrolled 
where quarter = 'spring' 
minus 
select studentid 
from enrolled 
where quarter = 'fall') 

Не совсем уверен, поддерживает ли MySQL ключевое слово минус. Некоторые db делают, другие нет. Если нет, он может поддерживать ключевое слово except.