关于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
?
答案 0 :(得分:1)
我在创建这个问题时找到了答案,但也许它会对其他人有所帮助。
答案是新的GROUP BY
功能as of 9.1:
当存在GROUP BY时,SELECT列表表达式无法引用未聚合的列,但聚合函数中或未分组的列在功能上依赖于分组列,因为否则会超过为未分组的列返回一个可能的值。如果分组列(或其子集)是包含未分组列的表的主键,则存在功能依赖性。
通过仅引用id
中的GROUP BY
,您可以利用该新功能,因为所有剩余的obj
列都是"功能相关的"在id
主键上。
不知何故,奇妙地避免了Postgres对依赖列(包括在这种情况下导致问题的json
列)进行等式检查的需要。
快乐的日子! :)