【问题标题】:Oracle ORA-00937: not a single-group group function in SubqueryOracle ORA-00937: 在子查询中不是单组组函数
【发布时间】:2014-09-24 13:32:35
【问题描述】:

我正在处理 Hibernate 查询。此查询适用于 MySQL,但在 Oracle 和 postgreSQL 中失败。

SELECT MIN(t.startTime) AS StartTime,
MAX(t.endTime) AS EndTime,
(SELECT SUM(t2.occurances) from table2 as t2)
from table1 as t1

我得到了错误-

ORA-00937: 不是单组群函数

我该如何解决这个问题?此表仅返回一行。如果我通过在 SELECT 中添加一个额外的列来添加组,它会返回多行。

【问题讨论】:

    标签: sql oracle hibernate oracle11g oracle10g


    【解决方案1】:

    这适用于 MySQL,因为 MySQL 扩展了 group by。不幸的是,编译器在查看聚合查询时不会将子查询视为“常量”。所以,这只是group by 子句中没有的另一个表达式。

    这是一种编写兼容所有三个数据库的查询的方法(但不适用于 Hibernate):

    SELECT MIN(t.startTime) AS StartTime, MAX(t.endTime) AS EndTime, MAX(occurrences)
    from table1 t1 cross join
         (SELECT SUM(t2.occurrences) as occurrences from table2 t2) t2;
    

    我应该补充一点,您也不能将子查询添加到 group by 子句,尽管以下内容在 Oracle 和 Postgres 中可以使用:

    SELECT MIN(t.startTime) AS StartTime, MAX(t.endTime) AS EndTime,
           (SELECT SUM(t2.occurances) from table2 t2)
    FROM table1 t1
    GROUP BY 3;
    

    编辑:

    与标准 SQL 相比,HQL 具有很大的限制性。以下是 close 两个你想要的,但它返回至少两行而不是 1:

    select t.starttime, t.endtime, (SELECT SUM(t2.occurances) from table2 t2)
    from table1 t
    where t.starttime = (select min(starttime) from table1) or
          t.endtime = (select max(endtime) from table1);
    

    【讨论】:

    • 但是在 MySQL 中失败了!
    • @Sayan。 . .第一个版本应该适用于所有三个数据库(现在我已经从表别名中删除了as)。
    【解决方案2】:

    只需为第三列添加GROUP BY

    SELECT MIN(t1.startTime) AS StartTime,
      MAX(t1.endTime) AS EndTime,
      (SELECT SUM(t2.occurances) FROM table2 t2) as occurances
    FROM table1 t1
    GROUP BY 3
    

    此查询返回一行。

    编辑:

    或者,您可以使用额外的聚合函数(例如MAX),然后GROUP BY 不是必需的:

    SELECT MIN(t1.startTime) AS StartTime,
      MAX(t1.endTime) AS EndTime,
      MAX( (SELECT SUM(t2.occurances) FROM table2 t2) ) as occurances
    FROM table1 t1
    

    【讨论】:

    • 现在我明白了 - ORA-00979:不是 GROUP BY 表达式
    • 谢谢!无论如何我可以在没有 GROUP BY 的情况下做到这一点吗?
    • @Sayan 添加了不带GROUP BY 的查询;在 MySQL、Oracle 上测试。
    • 谢谢!但是我在这里遇到了这个 Hibernate 错误:hibernate.atlassian.net/browse/HHH-9331
    【解决方案3】:

    试试这个:

    with t1 as (
        SELECT MIN(t.startTime) AS StartTime,
        MAX(t.endTime) AS EndTime
        from table1 as t1
    ), t2 as (
        SELECT SUM(t2.occurances) occurances from table2 as t2
    )
    select t1.starttime, t1.endtime, t2.occurances
      from t1, t2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2021-11-30
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多