SQL查询抛出“不是在聚合函数或group by子句”异常

问题描述:

我正在修复我们正在通过Hibernate/DBUnit进行测试的项目的测试套件。有几个测试用例都抛出了与Hibernate类似的异常,如下所示:SQL查询抛出“不是在聚合函数或group by子句”异常

java.sql.SQLException:不在聚合函数或group by子句中:[email protected] in statement [ ... 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数据库结构,其中包含一些测试用例的虚拟测试数据以及用于hibernate的MySQL方言。我们使用的是dbunit 2.4.3/hibernate 3.2.6。我尝试使用最新的休眠,版本3.3.1,但它表现相同。

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

如果在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的打印输出吗?

+0

好吧,我可以让SWORN将我的SELECT子句中的所有列添加到GROUP BY中,但我想这就是我在夜间的凌晨调试时所得到的结果。无论如何,添加所有这些列(显然减去AVG列)现在可以解决问题。谢谢! – 2009-02-24 11:19:15

另外,ORDER BY在顺序字段不是字符串时不能在hsqldb中工作。

不幸的是,这导致不在聚合函数或分组由错误消息,这表明分组问题,因此混乱...

参见:

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查询的错误:http://markmail.org/message/42vmifme4opz4jgl

在一些系统(例如拓蓝),如果有注释行例如查询不起作用。相反,注释行的

-

使用这些符号注释

/*和r.name不为空*/

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