2014-09-24 56 views
1

我正在進行Hibernate查詢。這個查詢在MySQL中運行正常,但在Oracle和postgreSQL中失敗。Oracle ORA-00937:Subquery中沒有單組功能

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中添加一個額外的列來添加group by,它會返回多個行。

回答

1

只需添加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 
+0

現在我明白了--ORA-00979:不是GROUP BY表達式 – Sayan 2014-09-24 14:04:17

+0

@Sayan糾正了查詢;現在它的作品:http://sqlfiddle.com/#!4/b206c/3 – Rimas 2014-09-24 14:16:44

+0

謝謝!無論如何,我可以做到這一點沒有GROUP BY? – Sayan 2014-09-24 15:12:59

2

由於MySQL的擴展爲group by,這對MySQL很有效。不幸的是,當查詢聚合查詢時,編譯器不會將子查詢視爲「常量」。所以,這只是group by條款中的另一個表達式。

這裏是寫的查詢是所有三個數據庫兼容(而不是休眠)的方式:

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條款,雖然下面將在甲骨文和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; 

編輯:

HQL是非常嚴格的標準相比,SQL。以下內容出自接近你們兩個想要的東西,但它至少返回兩行,而不是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); 
+0

但它在MySQL失敗! – Sayan 2014-09-24 13:50:03

+0

@Sayan。 。 。第一個版本應該可以在所有三個數據庫中工作(現在我已經從表別名中刪除了'as')。 – 2014-09-24 13:53:51

+0

但它在休眠中不起作用吧? – Sayan 2014-09-24 13:56:24

1

試試這個:

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