У меня есть 2 простых стола: students(sno,sname,age)
и take(sno,cno)
. Take
- это таблица отношений между студентами и курсами N-N
.
Я хочу найти студентов, не принимающих определенный курс.Как этот запрос с HAVING MAX работает правильно?
Следующий запрос делает работу, но это мне не понятно, как это работает:
SELECT s.sno,s.sname,s.age
FROM students s LEFT JOIN take t
ON (s.sno = t.sno)
GROUP BY s.sno,s.sname,s.age
HAVING MAX(CASE WHEN t.cno = 'CS112' THEN 1 ELSE 0 END) = 0;
ли это делать с Поручения MAX
И HAVING
обрабатываются?
Тривиальным способ сделать это было бы с подзапроса:
SELECT * FROM students
WHERE sno NOT IN
(SELECT sno FROM take WHERE cno = 'CS112');
Но я заинтересован в понимании версии с помощью JOIN
'Взятие MAX этого CASE для каждой строки'. Строка или группа? Я могу смутно понять, что он делает что-то подобное. Я пытаюсь понять фактические шаги и промежуточные вычисления. – Cratylus
Для каждой строки (pre-'GROUP') она запускает этот случай. Затем, во время агрегации, он запускает 'MAX' как часть агрегации, давая max для каждой группы. В конце он отфильтровывает строки, соответствующие требованиям 'HAVING'. – Adrian
«CASE» всегда работает первым? Как мы узнаем заказ? – Cratylus