【postgresql】ERROR: column “xxxx.id“ must appear in the GROUP BY
作者:mmseoamin日期:2023-12-13

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子句中或在聚合函数中使用

【postgresql】ERROR: column “xxxx.id“ must appear in the GROUP BY,第1张

在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
  



美图欣赏

【postgresql】ERROR: column “xxxx.id“ must appear in the GROUP BY,第2张