2

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は、サブクエリの結果を除外する必要がありますか?

4

5 に答える 5

15
select count(*) from dual where 1=2

0 を返します。つまり、値がゼロの行です。

于 2009-06-10T18:55:18.237 に答える
4

サブクエリ内のすべてのカウントを返しますが、これは正しくは 0 です。集計関数を使用すると、常に (そして正しく) このように動作し、SQL 標準の一部です。

于 2009-06-10T18:55:37.377 に答える
0
 (select 'xyz' as txt from dual where 1=2)) 

このサブクエリは行を返しません。

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

このサブクエリは、常に1行を返します。

それが異なる振る舞いの理由です。

于 2009-06-11T12:06:47.203 に答える
0

集計関数が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
于 2009-06-10T19:08:45.027 に答える
0

countは常に数値、0 または正の整数を返すため、結果セットには常に 1 行が含まれます。

他の集計関数が返される可能性があることに注意してくださいNULL

于 2009-06-10T19:06:13.597 に答える