2015-11-10 33 views
-3

我有這個簡單的查詢,它適用於mysql, 完美,但是當我對ORACLE執行它時,我只得到一個異常。Oracle Sql如何使用HAVING GROUP BY?

SELECT 
    EMPLOYEE_NO, sum(`END` - `START`) as cnt 
FROM 
    EMPLOYEES 
    group by EMPLOYEE_NO 
    having cnt > 100; 

架構

+---------------------+------------------+------+-----+ 
| Field    | Type    | Null | Key | 
+---------------------+------------------+------+-----+ 
| EMPLOYEE_NO   | int(10) unsigned | NO | PRI | 
| START    | date    | NO |  | 
| END     | date    | NO |  | 
+---------------------+------------------+------+-----+ 
+1

請閱讀[**如何問**](http://stackoverflow.com/help/how-to-ask) \t \t \t和[**如何創建一個最小的,完整的,並且可驗證的例子。**](http://stackoverflow.com/help/mcve)你有什麼錯誤? –

+0

告訴我們你得到什麼錯誤,一開始;並且還顯示Oracle表的定義,而不是MySQL的定義? –

回答

4

你的代碼使用一個MySQL擴展到SQL,甲骨文不支持的。在標準SQL中,HAVING子句無法引用SELECT列表中的列別名。你可以寫你的查詢,而不是爲:

SELECT 
    EMPLOYEE_NO, sum("END" - "START") as cnt 
FROM 
    EMPLOYEES 
GROUP BY EMPLOYEE_NO 
HAVING sum("END" - "START") > 100; 

也就是說,重複表達式cntHAVING條款,而不是使用SELECT別名。

或者,也可避免由於父查詢執行主查詢作爲嵌入式視圖或CTE,並且使HAVING子句WHERE子句重複的表達:

SELECT * 
FROM (
    SELECT 
     EMPLOYEE_NO, sum("END" - "START") as cnt 
    FROM 
     EMPLOYEES 
    GROUP BY EMPLOYEE_NO 
) 
WHERE cnt > 100; 

此外,還需要一個不同的標識符引用語法,如上所示。

+0

「另外,您需要一個不同的標識符引用語法,如上所示。」 ......或者完全擺脫它們! – Boneist

0

是的,反引號是MySQL的東西,所以絕對必須刪除他們的Oracle。