`GROUP BY` 中未使用的字段在 HAVING 子句中不可访问
Fields that not used in`GROUP BY` is not reachable in HAVING clauses
GROUP BY
中未使用的字段在 SELECT
中不可用,但在 WHERE
中可用。这是有道理的,因为 WHEN
在 GROUP 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
子句中是允许的。
GROUP BY
中未使用的字段在 SELECT
中不可用,但在 WHERE
中可用。这是有道理的,因为 WHEN
在 GROUP 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
子句中是允许的。