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 脱敏后的示例:
SELECTID,tenant_id,remarks,SOURCE,create_user,create_time,update_user,update_time,work_source,platform_no
FROMwork_base GROUP BYwork_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 列。
怎么破解:
在子查询中完成聚合,然后关联包含需要显示字段的表。
SELECTt.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_sourceFROMwork_base WHEREwork_source IS NOT NULLGROUP BYwork_base ) t LEFT JOIN work_base wb ON t.work_source= wb.work_source