我有以下两张表:
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子句在聚合上引入了一个条件,即从多行产生的单个结果(如count、average、min、max或sum)的选择结果。您的查询调用了第二种条件(即聚合上的条件),因此HAVING可以正常工作。
根据经验,在GROUP BY之前使用WHERE,在GROUP BY之后使用HAVING。这是一个相当原始的规则,但在90%以上的情况下是有用的。
当你这样做的时候,你可能想用ANSI版本的join重写你的查询:
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。
WHERE子句在各个行上引入了一个条件;HAVING子句在聚合上引入了一个条件,即从多行产生的单个结果(如count、average、min、max或sum)的选择结果。您的查询调用了第二种条件(即聚合上的条件),因此HAVING可以正常工作。
根据经验,在GROUP BY之前使用WHERE,在GROUP BY之后使用HAVING。这是一个相当原始的规则,但在90%以上的情况下是有用的。
当你这样做的时候,你可能想用ANSI版本的join重写你的查询:
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。