繁体   English   中英

JOOQ:从按 1 列分组的另一个表中选择列

[英]JOOQ: Select columns from another table grouped by 1 column

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

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 问题是我不知道如何解决这个问题,我想听听任何建议。 我真的很感激任何帮助。

只需将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子句中的列具有函数依赖关系的列(或由列形成的表达式)。 即,如果您按主键分组,则该表的所有其他列在功能上都是相关的,因此也可以选择它们。 (只有少数数据库实现了此功能)
  • 所有其他列上的聚合函数

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM