2016-05-31 4 views
0

Цель состоит в том, чтобы показать самого молодого ученика в определенном классе. Я создал тот, у кого есть предложения GROUP BY и HAVING, но предлагаемый ответ их не использует. Хотя имеет смысл, как работает их ответ, я до сих пор не понимаю, почему мой нет. Разве это не должно быть одинаково?В чем разница между двумя SQL-запросами?

Mine печатает несколько рядов, вероятно, всех студентов в таблице ENROLLMENT. Он должен делать это, только если я опустил предложение HAVING из-за GROUP BY. Но почему он все еще делает это, даже если в предложении HAVING говорится об устранении групп, которые не соответствуют этому условию?

select 
    studfname 
    || ' ' 
    || studlname as fullname, 
    studdob 
from 
    uni.student s, 
    uni.enrolment e 
where 
    s.studid = e.studid 
    and 
    e.unitcode = 'FIT1004' 
    and 
    studdob = 
    (
    select 
     min(studdob) 
    from 
     uni.student s, 
     uni.enrolment e 
    where 
     s.studid = e.studid 
     and 
     e.unitcode = 'FIT1004' 
) 
order by 
    s.studid; 

SELECT studfname|| ' ' ||studlname AS stud_name, studdob 
    FROM uni.student s, uni.enrolment e 
    WHERE e.studid = s.studid 
    AND unitcode = 'FIT1004' 
    GROUP BY studfname, studlname, studdob 
    HAVING studdob = min(studdob); 

Заранее благодарен!

ответ

0

Вы просите каждый член ваша группа (имя шпильки, фамилия ученика, шпилька) ограничена их минимальным шпилькой (вот что делает ваше предложение HAVING). Поскольку у каждого члена вашей группы есть только одна шпилька, этот studdob совпадает с min (studdob) для этого члена группы.

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

HAVING studdob = ( 
    select 
     min(birthdate) 
    from 
     pat_Patient s, 
     phy_Physician e 
    where 
     s.PCPPhysicianSID = e.PhysicianSID 
     and 
     e.PhysicianSID = 26665 
) 

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

+0

Ах да. Я вижу это сейчас. Я думал, что предложение может сравнивать группы друг с другом. Нет ли другого способа сравнить группы друг с другом? Кроме подзапросов. –

+0

Если вы хотите сравнивать группы друг с другом, я бы предложил использовать временную таблицу или общее табличное выражение, чтобы сначала установить ваши группы, а затем запросить их со вторым запросом, чтобы выполнить сравнение/фильтрацию. IMO, временные таблицы или CTE обычно легче читать, кодировать и манипулировать, чем коррелированные подзапросы. – Shoeless

0

GROUP BY объединяет все результаты с одинаковым значением столбца в одну строку (в основном используется, когда вам нужны суммы, средние и т. Д.). В то время как HAVING - это вид WHERE, который вы можете использовать после загрузки всех результатов вашего запроса (состояние после извлечения)

Ни один из них не даст вам самого молодого студента. Я не уверен, что ваши имена столбцов, но вот запрос я хотел бы использовать:

SELECT studentname, studentage, class 
FROM students S 
WHERE studentage = (select MIN(studentage) from students where class = s.class) 

выбирает все студент, которые имеют youngests возраст своего класса

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