[英]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.NAME
和ROLE.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.