2014-02-26 61 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不是“单组”功能。

换句话说,让子查询中的聚合不计算在内。

相关问题