querygroupby在h2中工作,但在oracledb中不起作用

pbossiut  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(354)

我有如下问题:

SELECT
  sum(field1) as t1.sum_f1,
  (select count(*) from table2) as count_t2,
  t1.f2
FROM 
  t1
GROUP BY 
  t1.f2

此查询由javax.persistence.entitymanager java istance执行。
entitymanager在oracle数据库中运行查询。
我已经编写了mockito测试,在内存数据库中配置了h2。
问题如下:
当mockito测试(使用h2作为db)执行相同的查询时,它可以正常工作。
当我运行java应用程序(使用oracledb作为db)时,它会给出错误:ora-00979。
我认为它希望count\u t2在groupby字段列表中,但这是不允许的,因为内部查询是在sql中的groop by之后处理的(因此count\u t2在“groupby-time”处不可见)。
我该怎么解决?
谢谢。

wtlkbnrh

wtlkbnrh1#

将计算移到 FROM 条款:

SELECT SUM(field1) as t1.sum_f1, t2.count_t2, t1.f2
FROM t1 CROSS JOIN
     (SELECT COUNT(*) as count_t2 FROM  table2) t2
GROUP BY t1.f2, t2.count_t2;

带有聚合查询的子查询对于查询解析器来说可能很棘手。

pu3pd22g

pu3pd22g2#

我终于找到了让它发挥作用的方法。

SELECT
  sum(field1) as t1.sum_f1,
  count((select 1 from table2)) as count_t2,
  t1.f2
FROM 
  t1
GROUP BY 
  t1.f2

这样,投影字段就是“sum,count”和聚合字段。这个查询在h2和oracledb中都可以正常工作。

相关问题