2011-01-11 5 views
1

データが異なる場合は2行、同じ場合は1行が返されます。どうして?次の文撮影

select count(1) as cnt from tbl where val= 1 
union 
select count(1) as cnt from tbl where val = 0 

2つの選択は、結果はその値を持つ単一の行で同じ値を返す場合。選択が異なる値を返す場合、結果は2つの値を持つ2つの行になります。どうして?私が使用した行の合計数を見つけようとしています

数が異なる場合は期待通りに動作しますが、数が同じであれば半分の値を与える
select sum (cnt) from 
(
    select count(1) as cnt from tbl where value = 1 
    union 
    select count(1) as cnt from tbl where value = 0 
) as tbl2 

...

(PS:SQLがソリ​​ューションよりもこのように動作する理由にもっと興味がある)

答えて

7

この動作は仕様です。必要な動作を実現するには、UNION ALLを使用する必要があります。基本的には、UNIONは、セット内の重複を削除して、組合演算を実行します。

http://www.fmsinc.com/free/NewTips/SQL/SQLtip5.asp

+0

@Mherdadなぜ彼らはそれをそういうものにしましたか? – systemovich

+0

@Geoffrey、 'select count'の場合、それは奇妙に見えますが、' 'firstname、lastname from persons''の場合、各人物を一度返すのが理にかなっています。 –

+3

@Geoffrey:私はSQLを設計した時点では存在しませんでしたが、推測することができます。リレーショナルの計算は集合理論に基づいており、SQLは基本的にリレーショナルの計算クエリを表現するための構文です。基本的には、 'union'は' intersect'に相当し、どちらも理論的操作に設定されています。デザイナーはそれらをそのままにして、その目的のために別のクエリー演算子、 'union all'を導入することが理にかなっていました。 –

1

労働組合と労働組合との主な違いは、すべての組合がすべてのフィールドを超える異なるが返されないことです。組合がすべて返って、さまざまな結果セットを返す場所

関連する問題