Sql 为什么向select语句添加count(*)会强制子查询中存在一行?
在Oracle 9i上,为什么会出现以下结果“abc”Sql 为什么向select语句添加count(*)会强制子查询中存在一行?,sql,oracle,subquery,Sql,Oracle,Subquery,在Oracle 9i上,为什么会出现以下结果“abc” select 'abc ' || (select txt from (select 'xyz' as txt from dual where 1=2)) from dual 虽然这会产生“abc xyz”: select 'abc ' || (select txt from (select count(*), 'xyz' as txt from dual where 1=2)) from dual 为什么向子
select 'abc ' || (select txt from
(select 'xyz' as txt from dual where 1=2))
from dual
虽然这会产生“abc xyz”:
select 'abc ' || (select txt from
(select count(*), 'xyz' as txt from dual where 1=2))
from dual
为什么向子查询添加count(*)会导致不同的行为?谓词其中1=2
是否应排除子查询中的任何结果
select count(*) from dual where 1=2
返回0。也就是说,一行的值为零。它返回子查询中所有内容的计数,正确地说是0。使用聚合函数始终(且正确)以这种方式运行,并且是SQL标准的一部分。code>count将始终返回数值0或正整数,因此结果集中始终有一行
请注意,其他聚合函数可能返回
NULL
了解聚合函数在SQL中的操作方式对于编写正确的查询至关重要。向查询中添加聚合函数(如sum、avg、min、max、count)时,要求数据库对一组结果执行组操作。大多数聚合(如min和max)在显示一组空行以进行操作时将返回null。例外情况是count()-当显示一个空集或空行时,它(正确地)返回0
这个问题源于对一个更复杂的查询的分析——在select子句中有多个子查询表达式。事实证明,在select表达式中添加count(*)会对结果造成一些破坏,因为它开始返回一个不需要的值
开发人员真正想要的是,count(*)
将产生null。实现这一点的最简单方法是在Oracle中使用分析。可以编写查询以使用等效的分析计数:count(*)over()
select 'abc ' || (select txt from
(select count(*) over (), 'xyz' as txt from dual where 1=2))
from dual
此子查询不返回任何行
(select count(*), 'xyz' as txt from dual where 1=2))
此子查询始终返回1行
这就是不同行为的原因。完全正确。。。这个问题是在一个更复杂的查询中出现的,在这个查询中,它被其他行为掩盖了。我终于意识到了错误——最初的开发人员确实需要使用count(*)over()——分析函数正确地返回NULL——这正是开发人员在本例中真正想要的。
(select count(*), 'xyz' as txt from dual where 1=2))