小编典典

SQL-在哪里

sql

我有以下两个表:

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);

是什么原因?谢谢。


阅读 140

收藏
2021-05-05

共1个答案

小编典典

WHERE子句在 单行 上引入条件; HAVING子句引入了 聚合 条件,即选择结果,其中已从 多个
行生成单个结果,例如计数,平均值,最小值,最大值或总和。您的查询需要第二种条件(即聚合条件),因此HAVING可以正常工作。

根据经验,请WHERE在之前GROUP BYHAVING之后使用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)

这将消除WHERE用作 θ连接条件的条件

2021-05-05