我有以下两张表:

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

但当我try 这个时,它是有效的:

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条对第individual rows条提出了条件;HAVING条款在aggregations上引入了一个条件,即 Select 的结果,其中从multiple行生成了单个结果,如计数、平均值、最小值、最大值或总和.您的查询需要第二种条件(即聚合上的条件),因此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)

这将消除用作theta join conditionWHERE.

Sql相关问答推荐

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

SQL是否可以计算每年的所有日期变化?

当我们加入两个表时,我们可以省略GROUP BY中的列名吗?

有没有办法在每次计算每一行的数据时更新2个值?

如何使用WSO2将空值传递给我的SQL Server存储过程?

SQL:如何将相应位置的两个数组中的元素组合在一起

带上最后日期(结果)

属于(日期)范围类型及其交集的总权重​

仅在日期相隔时递增(Oracle SQL)

使用递归CTE在BigQuery中获取文件路径

无法访问级联删除导致的触发器中已删除的外键记录

向表中添加新列取决于表的日期列(unpivot)

Clickhouse:左连接表到外部数组

清理 XML 数据

避免在SQL中使用具有相同条件的多个子查询

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

使用 regexp_replace 替换所有出现的特殊字符

MIN MAX 值与条件绑定

如何找到特定时间间隔内的最大和最小日期?

将单行中的多个行值转换为列