SQL Server 错误:聚集不能出现在where子句中,除非它位于having子句或选择列表中包含的子查询中

llew8vvj  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(358)

我有以下代码(见下文),用于查找员工的最小出生日期。
我不明白为什么它抛出错误:
聚合不能出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。
下面的代码引发前面的错误:

SELECT *
  FROM [TerpsConsultant.Employee] e1
  WHERE EXISTS (
SELECT *
  FROM [TerpsConsultant.Employee] e2
  WHERE e1.empDateOfBirth = MIN(e2.empDateOfBirth)
)

enter image description here
在这里搜索类似的问题后,我尝试了这段代码,它工作得很好:

SELECT *
  FROM [TerpsConsultant.Employee] e1
  WHERE EXISTS (
SELECT *
  FROM [TerpsConsultant.Employee] e2
  WHERE e1.empDateOfBirth = (SELECT MIN(e2.empDateOfBirth) FROM [TerpsConsultant.Employee] e2)
)

你能帮我理解为什么第一版的代码不起作用吗?到底有什么区别?

mqkwyuun

mqkwyuun1#

正如其他人已经在评论中说过的,你不能在where子句中使用聚合函数。
MSDN Aggregate Functions中所指定,只能在以下情况下将聚合函数用作表达式:

  • SELECT语句(子查询或外部查询)的选择列表。
  • HAVING子句。

所以在第一条语句中,你的代码是无效的,因为它不满足使用聚合的要求,而在第二条语句中,你有一个返回聚合的子查询,然后它才检查where条件。
Sergey Kalinichenko回答on this old post时。
WHERE子句在 * 单个行 * 上引入了条件; HAVING子句在 * 聚合 * 上引入了条件,即从多行生成单个结果(如计数、平均值、最小值、最大值或总和)的选择结果。您的查询调用了第二种条件(即聚合条件),因此HAVING可以正常工作。

相关问题