【发布时间】:2013-12-24 13:22:07
【问题描述】:
我们正在尝试运行此查询。
select ccr.id as id, ccr.title as name, c.name as contract, ccr.status as status
from change_request ccr
LEFT JOIN contract c ON ccr.contract_id = c.id
where ccr.id < 2000
GROUP BY ccr.id, c.id
order by id
它正在抛出错误 ***错误***
错误:列“ccr.title”必须出现在 GROUP BY 子句中或在聚合函数中使用 SQL 状态:42803 字符:22
为什么它要求同一个表中的多个列。我的意思是,如果我们按 ccr.id 分组,则不应询问同一表中的所有列。
更有趣的是,以下查询(类似于上面)运行良好。
select aim.id as id, aim.name as name, c.name as contract, aim.planned_completion_date as plannedcompetitiondate
from action_item_mgmt aim
LEFT JOIN contract c ON aim.contract_id = c.id
WHERE aim.id < 2000
group by aim.id, c.id
order by id
【问题讨论】:
-
ccr.id是change_request表的主键吗?我从逻辑上知道这听起来像,但标识列不一定是主键。为了让 Postgresql 知道表中的其他列在功能上依赖于id,它必须被标记为主键 -
谢谢,我们遇到了问题。仅此而已。它不是主键。
-
如果您使用 MySQL,您的查询将有效。但是对于其他数据库服务器,除了包含聚合函数的列之外,必须指定每一列。
-
@GarethD,请发表您的评论作为答案。我会将其标记为正确。谢谢。
-
@SaharshShah 这不是真的,SQL 标准允许 select 中不包含在 group by 或聚合中的列/表达式,只要它们在功能上依赖于 group by 中的列. Postresql 已经部分实现了这一点。 Example on SQL Fiddle,或者更多阅读我最近做了一个相对深入的answer讨论标准的MySQL(非常松散)实现。
标签: sql database postgresql