我不确定如何解释这个问题,但基本上我正在尝试做这样的事情:
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
。问题是我不确定如何解决这个问题,并希望听到任何建议。我非常感谢任何帮助。
答案 0 :(得分:1)
只需将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
条款&#34;发生&#34;是非常重要的。逻辑上在SELECT
子句之前,意味着一旦按一组列分组,SELECT
仍然可用的列集非常有限。作为一般经验法则,您只能选择:
GROUP BY
子句GROUP BY
子句中出现的列上具有功能依赖性的列(或由列组成的表达式)。即如果按主键分组,则该表的所有其他列都是功能相关的,因此也可以选择它们。 (只有少数数据库实现此功能)有关SQL操作顺序的更多信息,请访问:https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql-operations