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