Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 单行子查询为COUNT()函数返回多行错误_Oracle_Count - Fatal编程技术网

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

Oracle 单行子查询为COUNT()函数返回多行错误,oracle,count,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 unio

我试图理解为什么这会抛出一个错误-

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  

请看一下COUNT函数的语法:

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

现在看一下表达式的定义

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

值-表示单个、一个、标量、单个、简单、原子值

像向量、数组、表或结果集这样的值不多

只有一个值,比如2或10

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

表达式:=

定义了标量子查询

标量子查询表达式是从一行中恰好返回一个列值的子查询

由于查询中的子查询返回两行,因此它不符合标量子查询的定义,这就是此错误的原因:

ORA-01427:单行子查询返回多行


编辑:问题2:但是count不应该计算结果集中的行数吗

当然可以。Count是聚合函数之一

见本章: 这里还有一些例子:

聚合函数基于行组而不是单行返回单个结果行。聚合函数可以出现在select列表中,也可以按ORDER BY和HAVING子句出现。它们通常与SELECT语句中的GROUPBY子句一起使用,在SELECT语句中,Oracle数据库将查询表或视图的行划分为多个组。在包含GROUPBY子句的查询中,select列表的元素可以是聚合函数、GROUPBY表达式、常量或涉及其中一个的表达式。Oracle将聚合函数应用于每组行,并为每组返回一个结果行

如果省略GROUP BY子句,则Oracle会将select列表中的聚合函数应用于查询表或视图中的所有行。您可以在HAVING子句中使用聚合函数,根据聚合函数的结果,而不是查询的表或视图的各行的值,从输出中删除组


简言之,聚合函数只能用于带有GROUP BY和HAVING子句的查询,如下所示:

SELECT count( x )
FROM table
......
GROUP BY yyy
特殊情况是当您省略GROUP BY时:

如果省略GROUP BY子句,则Oracle会将select列表中的聚合函数应用于查询表或视图中的所有行


但是,在这些查询中,count只能接受标量子查询或*作为其参数的表达式。

但是count不应该计算结果集中的行数吗?聚合函数只能用于带有GROUP BY和HAVING子句的查询-请参阅问题中的第二个查询。没有分组,但计数工作正常。
SELECT count( x )
FROM table