我有2个简单的表:students(sno,sname,age)
和take(sno,cno)
。 Take
是学生与课程之间的N-N
关系表。
我想找到不参加特定课程的学生。
以下查询可以完成工作,但我不清楚它是如何工作的:
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
了解版本 最佳答案
如果CASE
内部的MAX
有路线,则产生1,如果没有路线,则产生0。对每行取该MAX
的CASE
,如果学生有任何行,则该行将为1(表示他们拥有该班级),否则为0。说他们必须HAVING
MAX
> 1
,就意味着他们必须要上课。以最复杂的方式。
关于mysql - 使用HAVING MAX进行的此查询实际上如何正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16047148/