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