org.postgresql.util.PSQLException: ERROR: column "xxx.id" must appear in the GROUP BY clause or be used in an aggregate function
错误:列“XXXX.id”必须出现在GROUP BY子句中或在聚合函数中使用
在mysql中是正常使用的,在postgresql是不可以的。
具体SQL 脱敏后的示例:
- SELECT
- ID,
- tenant_id,
- remarks,
- SOURCE,
- create_user,
- create_time,
- update_user,
- update_time,
- work_source,
- platform_no
- FROM
- work_base
-
- GROUP BY
- work_source
在标准 SQL 中,包含GROUP BY
子句的查询不能引用选择列表中未在GROUP BY
子句中命名的非聚合列。
MySQL 扩展了 的使用,GROUP BY
以便选择列表可以引用未在GROUP BY
子句中命名的非聚合列。前面的查询在 MySQL 中是合法的。
可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 中命名的非聚合列中的所有值GROUP BY
对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加ORDER BY
子句的影响。结果集的排序发生在选择了值之后,并且ORDER BY
不影响服务器选择每个组中的哪些值。
SQL92 及更早版本不允许查询的选择列表、HAVING 条件或 ORDER BY 列表引用未在 GROUP BY 子句中命名的非聚合列。
SQL99 及更高版本根据可选功能 T301 允许此类非聚合如果它们在功能上依赖于 GROUP BY 列。
在子查询中完成聚合,然后关联包含需要显示字段的表。
- SELECT
- t.ID,
- t.tenant_id,
- t.remarks,
- t.SOURCE,
- t.create_user,
- t.create_time,
- t.update_user,
- t.update_time,
- t.work_source
- FROM (
-
- SELECT work_source
- FROM
- work_base
- WHERE
- work_source IS NOT NULL
- GROUP BY
- work_base
-
-
- ) t LEFT JOIN work_base wb ON t.work_source= wb.work_source