PostgreSQL 9.2执行GROUP BY语句报错但12版本无异常的问题咨询
问题根因
这个报错是PostgreSQL版本间GROUP BY子句的语法解析逻辑差异导致的,和GROUP BY的官方语义规则无关:
- PostgreSQL 9.2及更早版本中,
GROUP BY (f.fa_docnum, f.fa_date)里的括号会被解析为单个ROW复合类型值,而不是两个独立的分组列。此时SELECT子句中单独引用的f.fa_docnum、f.fa_date两个独立列既没有出现在GROUP BY的独立分组项中,也没有被聚合函数包裹,因此触发报错。 - PostgreSQL 9.3及之后的版本优化了该场景的解析逻辑:如果GROUP BY后括号内仅包含普通列名列表、没有嵌套函数或表达式,会自动忽略外层括号,等价于
GROUP BY f.fa_docnum, f.fa_date,所以你的语句在本地12.6版本运行正常。
你删除GROUP BY中的f.fa_date后括号内仅剩余单个列,此时所有版本都会将其解析为普通的单字段分组规则,因此不会触发报错。
通用解决方案
优先选择语法兼容的写法,可同时适配所有PostgreSQL版本:
- 直接删除GROUP BY子句中的多余括号,改为
GROUP BY f.fa_docnum, f.fa_date即可,该写法语义和你原写法预期完全一致,不存在兼容性问题。
修改后的完整语句示例:
SELECT f.fa_docnum, f.fa_date, sum(l.lj_credit), sum(l.lj_debit) FROM livrejournal l, document d, facture_achat f WHERE d.doc_id = l.lj_docid AND d.doc_fa_docnum = f.fa_docnum AND f.fa_fournisseur = 59 GROUP BY f.fa_docnum, f.fa_date;
- 如果你的业务逻辑中
fa_docnum是facture_achat表的唯一主键,仅按fa_docnum分组也可以得到一致结果,这种写法也兼容所有版本。
内容的提问来源于stack exchange,提问作者Erik Martre
相关产品推荐
相关产品推荐

