我有以下两个表:
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
可以正常工作。
根据经验,请在 GROUP BY
之前使用 WHERE
,在 GROUP BY
之后使用 HAVING
。这是一个相当原始的规则,但在 90% 以上的情况下都是有用的。
当您执行此操作时,您可能希望使用 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)
这将消除用作 theta 连接条件的 WHERE
。
关于SQL - HAVING 与 WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57814980/