PostgreSQL插入语句聚合新增has_property字段时报GROUP BY错误如何解决
SQL调整方案
由于同个code分组下的所有源记录has_property值完全一致,只需要给查询中的has_property列套上聚合函数,满足SQL分组语法的校验规则即可,取值结果完全准确。
调整后可直接运行的SQL
sql = """ insert into metadata (code, code_map, has_property) ( select code, jsonb_agg(to_jsonb(new_code)) as code_map, max(has_property) as has_property from data_to_data where code is not null group by 1 ) on conflict (code) do update set code_map = excluded.code_map, has_property = excluded.has_property; """
可选的聚合替换方式
因为同组内has_property值没有差异,以下任意一种聚合函数都能拿到正确结果,可按环境选型:
max(has_property):兼容所有PostgreSQL版本,无版本依赖bool_or(has_property):布尔类型专用聚合函数,语义更直白any_value(has_property):PostgreSQL 13及以上版本支持,直接取组内任意一条的对应值,聚合性能最优
关键细节
原逻辑的冲突更新分支仅同步了code_map字段,这次调整已经把has_property加入更新列表,保证code重复触发冲突时,metadata表的字段值和源表最新数据对齐,不会残留旧值。
内容的提问来源于stack exchange,提问作者Sean Payne
相关产品推荐
相关产品推荐

