我有以下代码(见下文),用于查找员工的最小出生日期。
我不明白为什么它抛出错误:
聚合不能出现在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)
)
你能帮我理解为什么第一版的代码不起作用吗?到底有什么区别?
1条答案
按热度按时间mqkwyuun1#
正如其他人已经在评论中说过的,你不能在
where
子句中使用聚合函数。如MSDN Aggregate Functions中所指定,只能在以下情况下将聚合函数用作表达式:
所以在第一条语句中,你的代码是无效的,因为它不满足使用聚合的要求,而在第二条语句中,你有一个返回聚合的子查询,然后它才检查where条件。
当Sergey Kalinichenko回答on this old post时。
WHERE
子句在 * 单个行 * 上引入了条件;HAVING
子句在 * 聚合 * 上引入了条件,即从多行生成单个结果(如计数、平均值、最小值、最大值或总和)的选择结果。您的查询调用了第二种条件(即聚合条件),因此HAVING
可以正常工作。