【发布时间】:2021-05-03 20:42:18
【问题描述】:
不允许使用不带“GROUP BY”的“HAVING”:
SELECT *
FROM products
HAVING unitprice > avg(unitprice)
HAVING 子句中的“products.UnitPrice”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
但是当将相同的代码放在“EXISTS”下时 - 没有问题:
SELECT *
FROM products p
WHERE EXISTS (SELECT 1
FROM products
HAVING p.unitprice > avg(unitprice))
你能解释一下原因吗?
【问题讨论】:
-
您使用的是哪种数据库产品?这感觉就像在 mysql 中发生的一些愚蠢的废话。我的猜测是,您的子查询的
products.unitprice的平均聚合是推断出来的,因为它是子查询的products表中使用的唯一列(其他提到的列是p.unitprice和1两者都不在该表中) .在您的第一个查询中,您在同一条件语句中要求平均聚合和非聚合unitprice,而不使用窗口函数。 -
“不允许在没有 'GROUP BY' 的情况下使用 'HAVING'”——这可能是您的印象,但这是错误的。不允许在
HAVING子句中使用既不是HAVING子句中聚合函数的参数也不是GROUP BY子句中列出的列(或任何使用此类列的表达式)。SELECTBTW 之后列出的列也是如此。例如。试试SELECT avg(unitprice) FROM products HAVING avg(unitprice) > 0;。