簡體   English   中英

為什么在select語句中添加count(*)會強制子行存在於子查詢中?

[英]Why does adding count(*) to a select statement force a row to exist in a 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

為什么在子查詢中添加count(*)會導致不同的行為? 如果where 1=2的謂詞是否排除了子查詢中的任何結果?

select count(*) from dual where 1=2

返回0.即,值為零的行。

它返回子查詢中所有內容的計數,這是正確的0.使用聚合函數始終(並且正確)以這種方式運行並且是SQL標准的一部分。

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 'xyz' as txt from dual where 1=2)) 

該子查詢不返回任何行。

 (select count(*), 'xyz' as txt from dual where 1=2)) 

此子查詢始終返回1行。

這就是行為不同的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM