我有以下两个表:
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
根据经验,使用WHEREbeforeGROUP BY和HAVINGafter 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用作 theta join 条件 的那个。