我有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
'爲每行取最大值。行還是組?我可以隱約地理解它做的是類似的東西。我試圖理解實際的步驟和中間計算。 – Cratylus
對於每一行('-GROUP'前面),它都會運行該案例。然後,在彙總過程中,它將'MAX'作爲彙總的一部分,爲每個組提供最大值。最後,它會過濾出符合'HAVING'要求的行。 – Adrian
'CASE'總是先運行?我們如何知道訂單? – Cratylus