【问题标题】:aggregate function expected before ( in SELECT with subquery之前预期的聚合函数(在带有子查询的 SELECT 中
【发布时间】:2013-06-20 13:10:09
【问题描述】:

我有两张表 Project 和 Comptes 我想在一个查询中显示 Project 和他的厨师

原来如此

 Query q=se.createQuery("SELECT p.idpro,p.IdProjet,p.NomProjet,p.DateDeb,p.DateFin,p.nomimg  (SELECT c.Nom,c.Prenom  FROM   Compte u WHERE  u.Id = p.IdChef group by u.id) FROM   Projets p ");

        listPrj=q.list();
         data.setWrappedData(listPrj);

但仍然是 Get Error

Caused by: org.hibernate.QueryException: aggregate function expected before ( in SELECT [SELECT p.idpro,p.IdProjet,p.NomProjet,p.DateDeb,p.DateFin,p.nomimg  (SELECT c.Nom,c.Prenom  FROM   com.persistence.Compte u WHERE  u.Id = p.IdChef group by u.id) FROM   com.persistence.Projets p ]
    at org.hibernate.hql.classic.SelectParser.token(SelectParser.java:100)
    at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
    at org.hibernate.hql.classic.ClauseParser.end(ClauseParser.java:113)
    at org.hibernate.hql.classic.PreprocessingParser.end(PreprocessingParser.java:122)
    at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:29)

我不知道如何解决它,并且

【问题讨论】:

  • 在提出此类问题之前,请阅读文档并学习 sql 的基础知识
  • @Thomas Ruiz 感谢重播,但如果你不能帮助我,为什么要重播,如果你有解决方案,请问是什么?谢谢

标签: mysql sql hibernate aggregate


【解决方案1】:

问题的直接原因在于内部查询:

  SELECT c.Nom,   -- <-- Aggregate (min, max, sum etc.) expected here
         c.Prenom -- <-- Aggregate (min, max, sum etc.) expected here  
    FROM Compte u 
   WHERE u.Id = p.IdChef 
GROUP BY u.id

当使用 GROUP BY 时,SELECT 中的所有字段都应该在聚合函数中或 在 GROUP BY 中

查询本身非常繁琐,恕我直言,应该是这样的:

SELECT p.idpro,
       p.IdProjet,
       p.NomProjet,
       p.DateDeb,
       p.DateFin,
       p.nomimg,
       c.Nom,
       c.Prenom
  FROM Compte c,
       Projets p
 WHERE (c.Id = p.IdChef)

【讨论】:

  • 现在我收到此错误unindexed collection before []: projets1_.idchef
  • @DmitryBychenko 。 . .一方面,我认为使用旧式连接语法给出答案是一种不好的形式。对于这样的查询,您应该使用joinon
  • @Dmitry Bychenko 谢谢它对我有用,我做了一些改变,这很酷。 SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg, c.Nom, c.Prenom FROM Compte as c, Projets as p WHERE (c.id=p.IdChef)
【解决方案2】:
SELECT p.idpro,p.IdProjet,p.NomProjet,p.DateDeb,p.DateFin,p.nomimg,c.Nom,c.Prenom
from projects p,Compte c
where c.Id=p-IdChef
group by c.uid

【讨论】:

  • 。 .一方面,我认为使用旧式连接语法给出答案是一种不好的形式。对于这样的查询,您应该使用 join 和 on。
【解决方案3】:

这是您的查询格式,以便我可以阅读:

SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg 
      (SELECT c.Nom, c.Prenom 
       FROM   Compte u
       WHERE  u.Id = p.IdChef
       group by u.id
      )
FROM   Projets p 

您拥有的第一列是子查询之前缺少逗号。此外,您在select 子句中使用表引用c,但它从未定义。假设有逗号,u 应该是 c(表别名的缩写是个好东西)。

您的子查询在 u.id 上聚合;选择语句是c.nom, c.prenom。这正在产生错误。在大多数 SQL 版本中(MySQL 是一个主要例外),聚合查询中的所有列都必须在 group by 或聚合函数中。

另外,group by 不是必需的,因为您已经将其限制为一个值。这是使用limit 的修复:

SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg,
      (SELECT c.Nom, c.Prenom 
       FROM   Compte c
       WHERE  c.Id = p.IdChef
       limit 1
      )
FROM   Projets p 

编辑:

我误会了子查询返回两个值。这在嵌套的 select 语句中是不允许的。要包含名称,只需使用常规连接:

SELECT p.idpro, p.IdProjet, p.NomProjet, p.DateDeb, p.DateFin, p.nomimg, c.Nom, c.Prenom
 FROM   Projets p left outer join
       Compte c
       on  c.Id = p.IdChef

【讨论】:

  • 感谢您的帮助和解释,但仍然遇到同样的错误
  • @user2420469 。 . .此查询中没有隐式或其他方式的聚合。你确定这是完整的查询吗?如果你在任何地方都有聚合函数 (min(), max(), etc), then that would change the logic. Do the results change if you put the subquery in a max()`?
  • 我有两张桌子 Projets 和 Compte,我想显示他的主厨的所有项目,而同一个主厨可以拥有超过 1 个项目
  • @user2420469 。 . .我错过了查询中的一个问题。子查询返回两个值,而不是一个。在嵌套选择中不允许。只需使用常规连接。
  • 当我使用常规加入时,它返回此错误:outer or full join must be followed by path expression
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多