加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL -must出现在GROUP BY子句中,或者在聚合函数中使用

发布时间:2020-12-13 16:42:06 所属栏目:百科 来源:网络整理
导读:我在pg生产模式中得到这个错误,但它在sqlite3开发模式下工作正常。 ActiveRecord::StatementInvalid in ManagementController#indexPG::Error: ERROR: column "estates.id" must appear in the GROUP BY clause or be used in an aggregate functionLINE 1:
我在pg生产模式中得到这个错误,但它在sqlite3开发模式下工作正常。
ActiveRecord::StatementInvalid in ManagementController#index

PG::Error: ERROR:  column "estates.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "estates".* FROM "estates"  WHERE "estates"."Mgmt" = ...
               ^
: SELECT "estates".* FROM "estates"  WHERE "estates"."Mgmt" = 'Mazzey' GROUP BY user_id

@myestate = Estate.where(:Mgmt => current_user.Company).group(:user_id).all
如果user_id是PRIMARY KEY,那么需要升级PostgreSQL;较新的版本将正确处理主键的分组。

如果user_id既不是唯一的,也不是所讨论的’estates’关系的主键,那么这个查询没有什么意义,因为PostgreSQL无法知道为每个共享相同列的每个列的列返回哪个值用户名。您必须使用表达您想要的集合函数,如min,max,avg,string_agg,array_agg等,或者添加GROUP BY感兴趣的列。

或者,您可以重新使用查询以使用DISTINCT ON和ORDER BY,如果您确实想要选择一个有点任意的行,但我真的怀疑可以通过ActiveRecord来表达。

一些数据库(包括SQLite和MySQL)只会选择任意一行。 PostgreSQL团队认为这是错误的和不安全的,所以PostgreSQL遵循SQL标准,并将这些查询视为错误。

如果你有:

col1    col2
fred    42
bob     9
fred    44
fred    99

你做:

SELECT col1,col2 FROM mytable GROUP BY col1;

那么很明显你应该得到这个行:

bob     9

但是fred的结果呢?没有一个正确的答案选择,所以数据库将拒绝执行这样的不安全的查询。如果您想要任何col1最大的col2,您将使用最大聚合:

SELECT col1,max(col2) AS max_col2 FROM mytable GROUP BY col1;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读