postgresql - 如何在不将列名添加到 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";
解决方案
在标准 SQL 中,您必须将聚合函数之外的列表中出现的所有列添加到子句中。SELECT
GROUP BY
在 PostgreSQL 中,指定主键列就足够了,然后数据库可以推断所有其他列。
所以,假设这id
是表的主键"EXTR_Parcel"
(多么可怕的名字),你可以使用
GROUP BY p.id
但*
在SELECT
列表中使用几乎总是一个坏主意,因为表中的更改可能会导致意外的结果集更改,有时还会导致错误。
推荐阅读
- continuous-integration - 如何定期运行 gitlab 阶段?
- ruby-on-rails - 访问管理属性和管理?ruby on rails中的方法
- mdx - 如何从 MDX 中的日期级别提取月、年和日期
- mysql - 连接三个联结表
- qt - ALSA 的 .asoundrc 的默认值是什么?
- python - ModuleNotFoundError:没有名为“torch.nn”的模块;“火炬”不是 Mac OS 上的软件包
- json - 在 Powershell 中使用 Json 变量
- java - 使用 JPA 导致无限循环的 OneToMany 关系
- mysql - 与多个表有多对多关系 1-> 2.1, 2.2, 2.3
- authentication - 服务器端 Blazor:刷新页面后如何保持用户身份验证?