`GROUP BY` 中未使用的字段在 HAVING 子句中不可访问

Fields that not used in`GROUP BY` is not reachable in HAVING clauses

GROUP BY 中未使用的字段在 SELECT 中不可用,但在 WHERE 中可用。这是有道理的,因为 WHENGROUP BY 之前,但 HAVING 不应该必须能够访问该行的“其他”列。

例子

以下有效。

select fid, count(*)
from class
inner join faculty using (fid)
group by fid
having every(class.room = 'R128')

但是不能这样做。

select fid, count(*)
from class
inner join faculty using (fid)
group by fid
having class.room = 'R128' // Changed Line

以上片段的错误信息:

RROR:  column "class.room" must appear in the GROUP BY clause or be used in an aggregate function
LINE 7: having class.room = 'R128'
               ^
SQL state: 42803
Character: 86

我没有陷入XY Problem,我想知道为什么这是不可能的(问题是正确的every()后面的问题在语义上也是错误的)

您只能在 HAVING 子句中使用聚合函数,并且“every”是一个聚合函数

having用于过滤分组的结果

但是 room 列既不是聚合的一部分,也不是 GROUP BY 的一部分。

every() 是一个聚合函数,因此它在 having 子句中是允许的。