首页 > 解决方案 > 如何在不将列名添加到 GROUP BY 的情况下重写查询

问题描述

错误:列“p.PropName”必须出现在 GROUP BY 子句中或在聚合函数中使用

我在以下查询(PostgreSQL)中收到上述错误。如何重写它以包含p/中的所有列EXTR_Parcel

SELECT
    CONCAT(p. "Major", p. "Minor") AS "pin",
    p.*,
    json_agg(json_build_object('year', a. "RollYr", 'landVal', a. "LandVal", 'impsVal', a. "ImpsVal")) AS "appraisalHistory"
FROM
    "EXTR_Parcel" AS p
    LEFT JOIN "EXTR_RealPropApplHist_V" AS a ON p. "Major" = a. "Major"
        AND p. "Minor" = a. "Minor"
    GROUP BY
        p. "Major",
        p. "Minor";

标签: postgresql

解决方案


在标准 SQL 中,您必须将聚合函数之外的列表中出现的所有列添加到子句中。SELECTGROUP BY

在 PostgreSQL 中,指定主键列就足够了,然后数据库可以推断所有其他列。

所以,假设这id是表的主键"EXTR_Parcel"(多么可怕的名字),你可以使用

GROUP BY p.id

*SELECT列表中使用几乎总是一个坏主意,因为表中的更改可能会导致意外的结果集更改,有时还会导致错误。


推荐阅读