2013-06-03 35 views
0

我正在將Oracle查詢移植到Oracle。插入...用Oracle中的組選擇結果太多值

INSERT INTO 
    "stagedInserts" ("systemId", "timestamp") 
SELECT 
    :systemId AS "systemId", "d"."time" AS "timestamp" 
FROM 
    "data" "d" 
WHERE 
    "d"."systemId" = :systemId 
GROUP BY 
    TRUNC("d"."time"/900) 

的GROUP BY旨在是的"time" DIV 900在MySQL等效,以確保我們最終只有一個爲每個15分鐘(900秒)間隔時間戳記。

查看上述查詢結果爲ORA-00979: not a GROUP BY expression

但是,如果我的組添加到SELECT,所以我們結束:

SELECT 
    :systemId AS "systemId", "d"."time" AS "timestamp", TRUNC("d"."time"/900) 

它導致:ORA-00913: too many values

我該如何解決這個問題?

+2

這是一個mySQL似乎被「破壞」給我們這些不使用它的人的例子!如果你的'data'表包含時間值爲1,2,3,... 899的':systemId'的行,那麼mySQL在'time/900'分組後將'storedInserts'中存儲哪一個?無論答案是什麼,它都是任意的。 –

回答

2

你可以在d.time使用聚合函數:

SELECT :systemId AS systemId, MAX(d.time) AS timestamp 
           ----------- 
FROM data d 
WHERE d.systemId = :systemId 
GROUP BY TRUNC(d.time/900); 

或者你可以這樣做:

SELECT :systemId AS systemId, TRUNC(d.time/900)*900 AS timestamp 
           --------------------- 
FROM data d 
WHERE d.systemId = :systemId 
GROUP BY TRUNC(d.time/900); 

現在你選擇的是在GROUP BY子句中使用的值,並乘以一個常數,而不是選擇一個完全不同的值。

注意:這兩個查詢的結果是不一樣的,所以考慮哪個更可取。

0

在第一種情況下,您會收到錯誤信息,因爲無論何時將GROUP BY子句添加到您的查詢中,您都應該在列名中包含相同的值,這在第一個查詢中錯過了。

在表再添加一個列Trunc_Column,這將您的類似查詢的東西存儲截斷值,並切換到

INSERT INTO 
    "stagedInserts" ("systemId", "timestamp","Trunc_Column") 
SELECT 
    :systemId AS "systemId", "d"."time" AS "timestamp",TRUNC("d"."time"/900) 
FROM 
    "data" "d" 
WHERE 
    "d"."systemId" = :systemId 
GROUP BY 
    TRUNC("d"."time"/900) 

上面的語句將解決ORA-00913: too many values錯誤。