我的表和查询如下:
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
不是"单组"组函数。
换句话说,在子查询中包含聚合不算在内。