我有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;


它与处理MAXHAVING的顺序有关吗?

一个简单的方法是使用子查询:

SELECT * FROM students
WHERE sno NOT IN
(SELECT sno FROM take WHERE cno = 'CS112');


但是我有兴趣使用JOIN了解版本

最佳答案

如果CASE内部的MAX有路线,则产生1,如果没有路线,则产生0。对每行取该MAXCASE,如果学生有任何行,则该行将为1(表示他们拥有该班级),否则为0。说他们必须HAVING MAX > 1,就意味着他们必须要上课。以最复杂的方式。

关于mysql - 使用HAVING MAX进行的此查询实际上如何正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16047148/

10-09 22:42