有时发生错误的奇怪组
Posted
技术标签:
【中文标题】有时发生错误的奇怪组【英文标题】:strange group by error occuring SOMETIMES 【发布时间】:2018-12-28 07:35:18 【问题描述】:执行查询时,“有时”我的服务器日志中出现以下异常。 Query 有一个 group by 语句。如果我删除 GROUP BY,我永远不会得到异常。此外,并非所有使用 group by 的查询都会出现异常。他们中只有一部分是受害者。
我在集群中有两台服务器和一个客户端节点。
查询是否有任何问题,或者我是否遇到了错误,因为异常是随机发生的。奇怪的是,并不是所有的查询都有这个异常。我认为查询结构还可以。
Caused by: org.h2.jdbc.JdbcSQLException: Column "PR__Z0._VAL" must be in the GROUP BY list; SQL statement:
SELECT
PR__Z0._VAL __C0_0,
PR__Z0."dailyRock" __C0_1,
PR__Z0."productId" __C0_2
FROM TABLE("category" CHAR=?1) T__Z2
INNER JOIN ACC_6185BAEEDA626000."ProductCategory" PC__Z1
ON TRUE
INNER JOIN ACC_6185BAEEDA626000."ProductRecord" PR__Z0
ON TRUE
WHERE (PC__Z1."language" = ?2) AND ((PC__Z1."category" = T__Z2."category") AND (PR__Z0."productId" = PC__Z1."productId"))
GROUP BY PR__Z0."productId"
ORDER BY 2 DESC LIMIT ?3 + ?4 [90016-197]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.expression.ExpressionColumn.updateAggregate(ExpressionColumn.java:172)
at org.h2.expression.Alias.updateAggregate(Alias.java:87)
at org.h2.command.dml.Select.queryGroup(Select.java:350)
at org.h2.command.dml.Select.queryWithoutCache(Select.java:628)
at org.h2.command.dml.Query.queryWithoutCacheLazyCheck(Query.java:114)
at org.h2.command.dml.Query.query(Query.java:352)
at org.h2.command.dml.Query.query(Query.java:333)
at org.h2.command.CommandContainer.query(CommandContainer.java:114)
at org.h2.command.Command.executeQuery(Command.java:202)
at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:114)
at org.apache.ignite.internal.processors.query.h2.PreparedStatementExImpl.executeQuery(PreparedStatementExImpl.java:67)
at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeSqlQuery(IgniteH2Indexing.java:1421)
... 7 more
【问题讨论】:
【参考方案1】:见H2 DB - Column must be in Group By list。
Apache Ignite 在这方面是严格的,您只能将裸值放入您也放入 GROUP BY 列表的 SELECT 列表中:
SELECT V1, V2, V3 FROM table GROUP BY V1, V2, V3
所有其他值都需要包装在 aggregate function 中。
如SELECT MAX(_VAL), AVG("dailyRock"), "productId" ... GROUP BY "productId";
【讨论】:
以上是关于有时发生错误的奇怪组的主要内容,如果未能解决你的问题,请参考以下文章