【问题标题】:JOOQ: Select columns from another table grouped by 1 columnJOOQ:从按 1 列分组的另一个表中选择列
【发布时间】:2018-07-23 01:05:36
【问题描述】:

我不太确定如何解释这个问题,但基本上我正在尝试做这样的事情:

private SelectHavingStep<Record> singleUserQuery(Collection<Condition> conditions) {
    return dsl.select(USER_T.fields())
              .select(DSL.arrayAggDistinct(PERMISSION_T.NAME).as("permissions"))
              .select(ROLE.NAME.as("role"))
              .select(ROLE.ROLE_TYPE.as("roleType"))
              .from(USER_T)
                .leftJoin(USER_ACCOUNT_PERMISSIONS)
                    .on(USER_ACCOUNT_PERMISSIONS.USER_ID.eq(USER_T.ID))
                .leftJoin(PERMISSION_T)
                    .on(PERMISSION_T.NAME.eq(USER_ACCOUNT_PERMISSIONS.PERMISSION))
                .leftJoin(ROLE)
                    .on(ROLE.ID.eq(USER_T.ROLE_ID))
              .where(conditions)
                .groupBy(USER_T.ID);
}

我有一个 USER 表通过角色 ID 引用 ROLE 表,并且希望我的用户结果始终包含来自 ROLE 表的角色名称和类型。

这给了我以下错误PSQLException: ERROR: column "role.name" must appear in the GROUP BY clause or be used in an aggregate function。问题是我不确定如何解决这个问题,并希望听到任何建议。我真的很感激任何帮助。

【问题讨论】:

    标签: java postgresql spring-boot jooq


    【解决方案1】:

    只需将ROLE.NAMEROLE.ROLE_TYPE 添加到您的GROUP BY 子句中:

    ...
    .groupBy(USER_T.ID, ROLE.NAME, ROLE.ROLE_TYPE)
    

    或者,因为这是 PostgreSQL(它允许投影所有在功能上依赖于 GROUP BY 子句的列),添加 ROLE.ID 列可能就足够了:

    ...
    .groupBy(USER_T.ID, ROLE.ID)
    

    为什么会这样?

    SQL 初学者经常遇到的最大问题之一是不了解 SQL 子句中操作的逻辑顺序。在这种特殊情况下,重要的是要理解 GROUP BY 子句在逻辑上“发生”在 SELECT 子句之前,这意味着一旦您按一组列分组,这组列仍然可用于 SELECT是相当有限的。作为一般经验法则,您只能选择:

    • 出现在GROUP BY 子句中的列(或由列组成的表达式)
    • 对出现在GROUP BY 子句中的列有功能依赖的列(或由列组成的表达式)。 IE。如果您按主键分组,则该表的所有其他列在功能上都是依赖的,因此也可以选择它们。 (只有少数数据库实现了这个功能)
    • 在所有其他列上聚合函数

    更多关于 SQL 操作顺序的信息在这里:https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2016-07-22
      • 2020-07-25
      • 2011-03-30
      相关资源
      最近更新 更多