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

问题是您尝试在聚合查询中使用没有聚合函数的列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 ;

您的查询是:

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

这是一个聚合查询,返回一行。 外部查询中没有 group by 子句。 这意味着外部查询中的所有列引用都需要位于聚合函数中。

列引用c2不在聚合函数中。 因此,它会生成相应的错误。 错误文本对此进行了解释:

ORA-00937:不是单组组函数:来自测试1的SELECT count()/"c2",(来自test2的SELECT count()"c2")

也就是说,c2不是"单组"组函数。

换句话说,在子查询中包含聚合不算在内。

最新更新