我有以下两个表:
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
之前使用GROUP BY
,在HAVING
之后使用GROUP BY
。这是一个比较原始的规则,但在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 - SQL-在哪里,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9253244/