为什么count(*)不返回单组?

时间:2014-02-26 12:33:37

标签: sql oracle count aggregate-functions

我的表格和查询如下:

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(*)是一个聚合函数,应该返回一个值。

2 个答案:

答案 0 :(得分: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 ;

答案 1 :(得分: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”FROM test2)

也就是说,c2不是“单组”群组功能。

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