• 【postgresql】ERROR: column “xxxx.id“ must appear in the GROUP BY


    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 脱敏后的示例:

    1. SELECT
    2. ID,
    3. tenant_id,
    4. remarks,
    5. SOURCE,
    6. create_user,
    7. create_time,
    8. update_user,
    9. update_time,
    10. work_source,
    11. platform_no
    12. FROM
    13. work_base
    14. GROUP BY
    15. 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 列。

    怎么破解:

    在子查询中完成聚合,然后关联包含需要显示字段的表。

    1. SELECT
    2. t.ID,
    3. t.tenant_id,
    4. t.remarks,
    5. t.SOURCE,
    6. t.create_user,
    7. t.create_time,
    8. t.update_user,
    9. t.update_time,
    10. t.work_source
    11. FROM (
    12. SELECT work_source
    13. FROM
    14. work_base
    15. WHERE
    16. work_source IS NOT NULL
    17. GROUP BY
    18. work_base
    19. ) t LEFT JOIN work_base wb ON t.work_source= wb.work_source




    美图欣赏

  • 相关阅读:
    【Koltin Flow(三)】Flow操作符之中间操作符(一)
    第七章:java Object类
    CPU长指令(VLIW)失败的主要原因是什么,VLIW真的无药可救吗?
    MySQL数据库索引的数据结构
    android自定义View: 饼状图绘制(四)
    Python中的特殊方法__call__
    Java的动态代理Proxy.newProxyInstance
    课题学习(六)----安装误差校准、实验方法
    怎样做好接口自动化测试?
    Vue 组件之间的通信
  • 原文地址:https://blog.csdn.net/wochunyang/article/details/133168971