【问题标题】:Group By asking for extra columnsGroup By 要求额外的列
【发布时间】: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


【解决方案1】:

在任一查询中都没有聚合(如 count()sum()avg() 等):完全删除 group by 子句。

【讨论】:

  • 在实际查询中有更多表(我无法发布确切的查询)。在调试此错误时,我将查询简化为这个简单的查询。还有为什么其他查询运行良好。
  • 但是没有用到聚合函数,所以group by没有意义
【解决方案2】:

我可以看到您的第一个查询不起作用的唯一方法是如果列 id 不是 change_request 表的主键。

如果您将其设为主键,则您的第一个查询应该可以正常工作,尽管如前所述,分组似乎相当多余,没有聚合。

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2020-08-23
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多