我试图理解为什么会引发错误 -
select count((select 1 br from dual
union
select 2 br from dual))
from dual;
ORA-01427: single-row subquery returns more than one row
但这不会 -
select count(br)
from (select 1 br from dual
union
select 2 br from dual);
BR
----------
2
答案 0 :(得分:1)
看一下COUNT函数here的语法:
此函数接受表达式作为其参数。
现在看一下表达式 here的定义。
表达式是一个或多个值,运算符和SQL函数的组合,其值为值。
值 - 表示单个,一个,标量,个别,简单,原子价值
没有很多值,如矢量,数组,表格或结果集。
只有一个值,例如2或10。
表达式可以有多种形式,甚至可以是子查询,但SQL将此子查询限制为一种称为标量子查询的特殊形式,请参阅:
表达式:=
定义了标量子查询here
标量子查询表达式是一个子查询,它从一行返回一列值。
由于查询中的子查询返回两行,因此它不符合标量子查询的定义,这就是此错误的原因:
ORA-01427:单行子查询返回多行
编辑:问题#2:但是,不计算结果集中的行数吗?
是的,当然。 Count是聚合函数之一。
见本章:http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions003.htm#SQLRF20035 以及此处的示例:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF55380
聚合函数根据行组而不是单行返回单个结果行。聚合函数可以出现在选择列表和ORDER BY和HAVING子句中。它们通常与SELECT语句中的GROUP BY子句一起使用,其中Oracle Database将查询的表或视图的行划分为组。在包含GROUP BY子句的查询中,选择列表的元素可以是聚合函数,GROUP BY表达式,常量或涉及其中一个的表达式。 Oracle将聚合函数应用于每组行,并为每个组返回单个结果行。
如果省略GROUP BY子句,则Oracle会将选择列表中的聚合函数应用于查询的表或视图中的所有行。您可以在HAVING子句中使用聚合函数来根据聚合函数的结果从输出中消除组,而不是根据查询的表或视图的各个行的值来消除组。
简单来说,聚合函数只能用于具有GROUP BY和HAVING子句的查询,如下所示:
SELECT count( x )
FROM table
......
GROUP BY yyy
特殊情况是省略GROUP BY:
如果省略GROUP BY子句,则Oracle会将选择列表中的聚合函数应用于查询表或视图中的所有行。
SELECT count( x )
FROM table
但是,在这些查询中,count只能接受表达式(标量子查询)或*
作为它的参数。