Postgresql:单个表达式组不违反GROUP BY规则。为什么?

时间:2015-08-07 12:04:27

标签: postgresql

关于Ubuntu的Postgres 9.3。

我的桌子有点像这样

CREATE TABLE obj 
(
  id bigint NOT NULL,
  pid bigint,
  oobj json,
  ostamp bigint,
  CONSTRAINT "PK_obj_id" PRIMARY KEY (id)
);

我想使用父ID(obj)对pid加入其子项进行查询,并使用array_agg汇总子ID。我想出了这个

select p.*, array_agg(c.id)
from obj p
  inner join obj c on p.id = c.pid
where p.id = 12345
group by 1, 2, 3, 4;

当然我遇到了this problem:" ERROR: could not identify an equality operator for type json"。但由于某种原因,以下工作!

select p.*, array_agg(c.id)
from obj p
  inner join obj c on p.id = c.pid
where p.id = 12345
group by 1;  -- HERE IS THE CHANGE: also group by 1, 2, 4 works

问题是如何?为什么我不需要引用其他列group by

1 个答案:

答案 0 :(得分:1)

我在创建这个问题时找到了答案,但也许它会对其他人有所帮助。

答案是新的GROUP BY功能as of 9.1

  

当存在GROUP BY时,SELECT列表表达式无法引用未聚合的列,但聚合函数中或未分组的列在功能上依赖于分组列,因为否则会超过为未分组的列返回一个可能的值。如果分组列(或其子集)是包含未分组列的表的主键,则存在功能依赖性。

通过仅引用id中的GROUP BY,您可以利用该新功能,因为所有剩余的obj列都是"功能相关的"在id主键上。

不知何故,奇妙地避免了Postgres对依赖列(包括在这种情况下导致问题的json列)进行等式检查的需要。

快乐的日子! :)