Sql 为什么向select语句添加count(*)会强制子查询中存在一行?

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 为什么向子

在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
为什么向子查询添加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))