我有以下两个表:
1. Lecturers (LectID, Fname, Lname, degree). 2. Lecturers_Specialization (LectID, Expertise).
我想找到最专业的讲师。当我尝试此操作时,它不起作用:
SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID AND COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);
但是当我尝试这样做时,它会起作用:
SELECT L.LectID, Fname, Lname FROM Lecturers L, Lecturers_Specialization S WHERE L.LectID = S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise) >= ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID);
是什么原因?谢谢。
WHERE子句在 单行 上引入条件; HAVING子句引入了 聚合 条件,即选择结果,其中已从 多个 行生成单个结果,例如计数,平均值,最小值,最大值或总和。您的查询需要第二种条件(即聚合条件),因此HAVING可以正常工作。
WHERE
HAVING
根据经验,请WHERE在之前GROUP BY和HAVING之后使用GROUP BY。这是一个比较原始的规则,但在90%以上的情况下很有用。
GROUP BY
在执行此操作时,您可能希望使用ANSI版本的联接来重写查询:
SELECT L.LectID, Fname, Lname FROM Lecturers L JOIN Lecturers_Specialization S ON L.LectID=S.LectID GROUP BY L.LectID, Fname, Lname HAVING COUNT(S.Expertise)>=ALL (SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)
这将消除WHERE用作 θ连接条件的条件 。