2014-02-26 96 views
0

我的表和查詢如下:爲什麼count(*)不返回單個組?

CREATE TABLE test1 (
num NUMBER 
); 

INSERT INTO test1 VALUES (1); 
INSERT INTO test1 VALUES (1); 
INSERT INTO test1 VALUES (1); 
INSERT INTO test1 VALUES (1); 
INSERT INTO test1 VALUES (1); 

SELECT COUNT(*) FROM test1; 

CREATE TABLE test2 (
num NUMBER 
); 

INSERT INTO test2 VALUES (1); 
INSERT INTO test2 VALUES (1); 
INSERT INTO test2 VALUES (1); 
INSERT INTO test2 VALUES (1); 
INSERT INTO test2 VALUES (1); 

SELECT COUNT(*) FROM test2; 

SELECT count(*)/"c2" FROM test1, (SELECT count(*) "c2" FROM test2); 

DROP TABLE test1; 
DROP TABLE test2; 

爲什麼查詢1和2的返回一個值(5),但師(查詢3)返回一個ORA-00937錯誤?

如果我理解正確count(*)是一個聚合函數,並應返回一個單一的值。

+1

嘗試'SELECT count(*)/ MAX(「c2」)' –

+0

它的工作原理,但這並不能解決神祕的問題:) – Gust

+2

這裏沒有神祕之處。在這種情況下,'count()'用作聚合函數,除非將單個列或表達式作爲參數傳遞給另一個聚合函數,否則不允許在選擇列表中混合聚合函數和單個列或表達式,或者將它包含在'group by'子句中。 –

回答

3

問題是,您嘗試使用聚合查詢中沒有聚合函數的列c2

您可以使用:

SELECT count(*)/MAX("c2") 

或:

SELECT count(*)/MIN("c2") 

其它方式將是:

SELECT (SELECT count(*) FROM test1) 
    /(SELECT count(*) FROM test2) 
FROM dual ; 

或:

SELECT "c1"/"c2" 
FROM (SELECT count(*) "c1" FROM test1) 
    , (SELECT count(*) "c2" FROM test2) ; 

或更好的使用CROSS JOIN

SELECT "c1"/"c2" 
FROM (SELECT count(*) "c1" FROM test1) x1 
    CROSS JOIN 
     (SELECT count(*) "c2" FROM test2) x2 ; 
0

您所查詢的是:

SELECT count(*)/c2 
FROM test1 cross join 
    (SELECT count(*) as c2 
     FROM test2 
    ); 

這是一個集合的查詢,返回一行。外部查詢中沒有group by子句。這意味着外部查詢中的全部列引用需要位於聚合函數中。

列引用c2不在聚合函數中。因此,它會產生適當的錯誤。錯誤文本解釋了這一點:

ORA-00937:不是單組分組函數:SELECT COUNT()/ 「C2」 FROM TEST1,(SELECT COUNT() 「C2」 從測試2)

也就是說,c2不是「單組」功能。

換句話說,讓子查詢中的聚合不計算在內。

相關問題