单行子查询为COUNT()函数返回多个行错误

时间:2014-04-18 18:53:58

标签: oracle count

我试图理解为什么会引发错误 -

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  

1 个答案:

答案 0 :(得分:1)

看一下COUNT函数here的语法:

enter image description here

此函数接受表达式作为其参数。

现在看一下表达式 here的定义。

  

表达式是一个或多个值,运算符和SQL函数的组合,其值为

值 - 表示单个,一个,标量,个别,简单,原子价值

没有很多值,如矢量,数组,表格或结果集。

只有一个值,例如2或10。

表达式可以有多种形式,甚至可以是子查询,但SQL将此子查询限制为一种称为标量子查询的特殊形式,请参阅:

  

表达式:=

enter image description here

定义了标量子查询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只能接受表达式(标量子查询)或*作为它的参数。