2014-12-09 55 views
0

我得到:嘗試下面的查詢運行時「ORA-00979不是一個GROUP BY表達式」使用IN操作符,用情況,即隨着GROUP BY表達SQL

SELECT COUNT(column_1), 
    CASE 
    WHEN column_2 = 'Y' 
    OR column_3 IN 
     (SELECT column_4 FROM table_2 
    ) 
    THEN 'Y' 
    ELSE 'N' 
    END 
FROM table_1 
GROUP BY 
    CASE 
    WHEN column_2 = 'Y' 
    OR column_3 IN 
     (SELECT column_4 FROM table_2 
    ) 
    THEN 'Y' 
    ELSE 'N' 
    END 

用產品= Oracle數據庫11g企業版 版本= 11.1.0.7.0(64位製作)

是否有任何語法錯誤或任何在查詢中出錯?

回答

2

這工作得很好:

WITH table_1 AS (
    SELECT 'Y' column_1, 'N' column_2, 3 column_3 FROM dual 
    UNION ALL 
    SELECT 'N', 'Y', 3 FROM dual 
), 
table_2 AS (
    SELECT 1 column_4 FROM dual 
) 
SELECT COUNT(column_1), 
    CASE 
    WHEN column_2 = 'Y' 
    OR column_3 IN 
     (SELECT column_4 FROM table_2 
    ) 
    THEN 'Y' 
    ELSE 'N' 
    END 
FROM table_1 
GROUP BY 
    CASE 
    WHEN column_2 = 'Y' 
    OR column_3 IN 
     (SELECT column_4 FROM table_2 
    ) 
    THEN 'Y' 
    ELSE 'N' 
    END; 

但是,如果我改變這樣的定義:

table_2 AS (
    SELECT 3 column_4 FROM dual 
) 

所以條件爲真:

OR column_3 IN 
      (SELECT column_4 FROM table_2 
     ) 

然後我還得到「ORA-00979 :不是GROUP BY表達式「

我認爲Oracle不喜歡GROUP BY中的子查詢。 Oracle文檔指出,您不能在GROUP BY中使用子查詢,但可以在CASE中使用它們。

我想這將很難找到一個官方的參考爲什麼它這樣工作。在Oracle中有很多複雜的查詢。其中一些是缺陷,一些只是沒有記錄的功能。

0

我不認爲Oracle允許group by子句中的子查詢。您可以使用子查詢重寫此查詢:

SELECT COUNT(*), col 
FROM (SELECT t.*, 
      (CASE WHEN column_2 = 'Y' OR 
         column_3 IN (SELECT column_4 FROM table_2) 
        THEN 'Y' 
        ELSE 'N' 
       END) as col 
     FROM table_1 t 
    ) t 
GROUP BY col;