【问题标题】:SQL query throws "not in aggregate function or group by clause" exceptionSQL 查询抛出“不在聚合函数或 group by 子句中”异常
【发布时间】:2010-10-09 12:35:27
【问题描述】:

我正在为我们的一个项目修复测试套件,该项目正在通过 Hibernate/DBUnit 进行测试。有几个测试用例都从 Hibernate 中抛出了类似的异常,看起来像这样:

java.sql.SQLException:不在聚合函数或 group by 子句中:org.hsqldb.Expression@109062e 在语句 [... blah ...]

通过我的谷歌搜索,我怀疑这是由我们使用聚合函数 AVG() 引起的,因为这在异常消息中,并且所有抛出的查询都包含它。但是,我发现了几个指向遇到此错误的人的链接,并且能够通过注释掉“ORDER BY”或“GROUP BY”子句或将 SELECT 子句中的其他列包含在分组中来修复它。我理解为什么这会修复这样的错误消息,但我不确定它是否适用于我的情况,因为我尝试做同样的事情并且没有任何区别。此外,我们有一些测试用例会抛出使用 ORDER/GROUP 的异常,但不是全部。例如:

ThingerVO myThinger = (ThingerVO)session.createQuery("SELECT new ThingerVO(" +
"r.id, " + "u.id, " + "u.alias, " + "s.id, " +
"s.name, " + "r.URL," + "AVG(v.rating), " +
"r.totalCount, " + "r.isPrivate, " + "a.id, " +
"a.name, " + "r.transactionId, " + "r.size, " +
"u.hasPicture " +
") FROM Thinger r LEFT OUTER JOIN r.votes as v, Table1S s " +
"JOIN s.Table2A AS a, User u " +
"WHERE r.userId = u.id AND " +
"s.id = r.Table1SId AND " +
"r.id = :thingId")    
.setInteger("thingId", thingId)
.uniqueResult();

这个查询也会引发同样的异常,即使它没有使用 ORDER/GROUP 子句。此外,我将 Hibernate 生成的 HSQL 代码直接剪切/粘贴到 MySQL 查询浏览器中,它运行没有问题。此外,值得指出的是,所有这些代码在我们的生产数据库上都可以正常工作,所以我真的很困惑为什么会在这里抛出。

其他一些可能有用的信息——我们正在使用一个平面 XML 数据库结构,其中包含一些用于测试用例的虚拟测试数据,以及用于休眠的 MySQL 方言。我们正在使用 dbunit 2.4.3/hibernate 3.2.6。我尝试使用最新的休眠版本 3.3.1,但它的行为相同。

任何指针或提示将不胜感激。

【问题讨论】:

    标签: sql hibernate hsqldb dbunit


    【解决方案1】:

    在某些系统(例如 TALEND)中,如果有注释行示例,则查询不起作用:

    SELECT r.id,   
       u.alias,
       AVG(v.rating), 
       r.totalCount
    FROM Thinger r 
    LEFT OUTER JOIN r.votes as v, 
                         Table1S s 
    JOIN s.Table2A AS a, User u 
    WHERE r.userId = u.id 
    AND s.id = r.Table1SId 
    AND r.id = :thingId
    --AND r.name is not null 
    GROUP BY r.id, u.alias, r.totalCount
    

    为 MS SQL 查询提供错误。而不是注释行

    --

    使用这些符号进行评论

    /* AND r.name 不为空 */

    也许它会帮助某人并节省一些时间。

    【讨论】:

      【解决方案2】:

      此外,当 order-by 字段不是字符串时,ORDER BY 在 hsqldb 中不起作用。

      不幸的是,这会导致 Not in aggregate function or group by 子句错误消息,这表明存在分组问题,因此会造成混淆......

      见:http://markmail.org/message/42vmifme4opz4jgl

      【讨论】:

        【解决方案3】:

        如果您在 SQL 查询的 SELECT 部分中使用聚合函数(例如AVG())以及其他非聚合表达式,那么您必须有一个 GROUP BY 子句,该子句应列出所有非聚合表达式。

        我不熟悉 java,但是看一下代码,它似乎会创建并运行一个类似这样的查询(不太正确,但我认为足够接近):

        SELECT r.id, 
               u.id,
               u.alias,
               s.id, 
               s.name, 
               r.URL, 
               AVG(v.rating), 
               r.totalCount, 
               r.isPrivate, 
               a.id, 
               a.name, 
               r.transactionId,
               r.size, 
               u.hasPicture 
        FROM Thinger r 
        LEFT OUTER JOIN r.votes as v, 
                             Table1S s 
        JOIN s.Table2A AS a, User u 
        WHERE r.userId = u.id 
        AND s.id = r.Table1SId 
        AND r.id = :thingId
        

        ... 这没有GROUP BY,但在 SELECT 子句中混合了聚合和非聚合表达式。问题是 SQL 格式不正确。

        解决方法是在查询末尾添加GROUP BY

        我不能说为什么这在您的生产系统中有效,但我怀疑那里存在一些细微的差异。也许有些东西正在自动添加GROUP BY

        您能否发布它执行的 SQL 的打印输出?

        【讨论】:

        • 好的,我可以发誓我将 SELECT 子句中的所有列添加到 GROUP BY,但我想这就是我在凌晨进行调试时得到的。无论如何,添加所有这些列(显然减去 AVG 列)现在可以解决问题。谢谢!
        • 不用担心。我只注意到这些东西,因为我总是犯这样的错误。 ;)
        • SQL。服务器。糟透了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 2013-08-31
        • 2016-08-23
        • 2021-09-13
        • 1970-01-01
        相关资源
        最近更新 更多