[英]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.