Postgresql 9.2 错误与 group by 未出现在 postgresql 12 中

Posted

技术标签:

【中文标题】Postgresql 9.2 错误与 group by 未出现在 postgresql 12 中【英文标题】:Postgresql 9.2 error with group by which doesn't appear in postgresql 12 【发布时间】:2021-06-27 20:08:55 【问题描述】:

我有一个带有 'GROUP BY' 的 postgresql 函数,它在我的本地服务器上运行良好(postgresql 版本是 12.6),但得到了著名的错误 'column "f.fa_docnum" 必须出现在 GROUP BY 子句中或用于运行 postgresql 9.2.24 的 Web 服务器上的聚合函数。我对此完全感到困惑。 GROUP BY 子句的两个版本的文档完全相同。

这里是函数(比原来的简单一点,但得到的结果是一样的):

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);

在 9.2 版本的生产站点上,如果我删除 GROUP BY 子句中的“f.fa_date”列,我不会收到任何错误,而在 12.6(以及以前的更低版本)的本地开发站点上,我不会收到任何错误案子。 如果有人对这种奇怪的行为有任何想法,也许有一些提示或解决方法,我将不胜感激。

【问题讨论】:

与您的问题无关,但是:Postgres 9.2 是no longer supported,您应该尽快计划升级。 【参考方案1】:

由于列周围有括号,您只能按单个列进行分组。表达式(f.fa_docnum, f.fa_date) 是一个单列,具有包含两个字段的匿名记录类型。

Postgres 9.2 似乎无法检测到记录表达式的字段之一是表的主键,因此引发了错误。虽然 Postgres 12 可以检测到记录的字段之一是表的主键列。

解决方案是删除列周围的括号。他们一开始就没有任何目的,实际上在你的情况下是一个错误。

【讨论】:

是的!你的回答很完美,非常感谢。不幸的是,我的声誉仍然太低,无法让我投票。对于 9.2 版本,我知道它已经过时,但我的主机使用 Cpanel,尽管有(可能不是很多)用户的请求,但它没有更新 Postgresql 或 phpPgAdmin。

以上是关于Postgresql 9.2 错误与 group by 未出现在 postgresql 12 中的主要内容,如果未能解决你的问题,请参考以下文章

在同一系统上安装多个 postgreSQL

播放框架中未解决的 postgresql 9.2 jar 依赖关系

如何在 PostgreSQL 9.2 中分析 plpgsql 函数

PostgreSQL 9.2 服务不断失败

PostgreSQL 9.2 归档恢复后最后重放的 WAL

将 CSV 文本数组导入 PostgreSQL 9.2