2016-12-20 9 views
1

なぜ次のクエリが期待値の代わりに1を与えるのですか?SELECT SUM(1)FROM(SELECTからtに「0」を、二重UNION ALL SELECTで「1」をR FROM dualとして)

SELECT SUM(1) FROM (
SELECT '0' as R FROM dual 
UNION 
SELECT '1' as R FROM dual 
) 

しかし、このクエリは期待値を満たしていますか?

SELECT SUM(R) FROM (
SELECT '0' as R FROM dual 
UNION 
SELECT '1' as R FROM dual 
) 
+1

OracleまたはMySQLのクエリでは、あなたはRは、行の0、他方では1で、次のような2つの行を、持っています? – Aleksej

+2

意味のあるタイトルを使用してください – HoneyBadger

+2

2番目の問合せが期待通りの結果を得た場合、Oracleは間違った期待を持っていると教えてくれました。文字列を追加するので、2番目のクエリがエラーをスローするようにする必要があります。残念ながら、オラクルは警告なしに「心を読んで」文字列を数字に変換するという悪い習慣を持っています。このような習慣を忘れるために、あなたにはうってつけのサービスがあります。 – mathguy

答えて

2

最初のクエリは、内部クエリに存在するレコードごとに合計1です。これは、一定の値で合計したためです:SUM(1)これは基本的にはCOUNT(*)/COUNT(1)と同じ結果を返します。

第クエリはR列の値を加算さ - 最初のクエリではまだ、選択の任意の行の各発生に対して1を加算しているので1

3

に等しい>01クエリ1では、選択範囲内の各行に対して 'R'の値が何であれ合算します。最初のクエリで

2

SUM(1)COUNT(*)と等価である:それはその行の内容に関わらず、FROMテーブルの各行の合計に1を追加

SELECT COUNT(*) FROM ... 

ため。

2番目のクエリはRの値に注意しているため、10に追加してゼロになります。

2

SELECT 1を実行すると、ハードコードされた値1が抽出されますが、最初の列は予測されません。あなたのクエリは

SQL> SELECT 1 
    2 FROM (SELECT '0' AS R FROM DUAL 
    3   UNION 
    4   SELECT '1' AS R FROM DUAL 
    5  ); 

     1 
---------- 
     1 
     1 

です。これらの行のSUMは2与える:

SQL> SELECT SUM(1) 
    2 FROM (SELECT '0' AS R FROM DUAL 
    3   UNION 
    4   SELECT '1' AS R FROM DUAL 
    5  ); 

    SUM(1) 
---------- 
     2 

たとえば、あなたはこれがselect 100は、内部クエリの100回目のコラムを探していないことを明確に

SQL> select 100 
    2 from (select 1 from dual); 

     100 
---------- 
     100 

試すことができますが、単純に値を与える100

Rの変数値を抽出しています(文字列を数値に編集しました)。

SQL> SELECT R 
    2 FROM (SELECT 0 AS R FROM DUAL 
    3   UNION 
    4   SELECT 1 AS R FROM DUAL 
    5  ); 

     R 
---------- 
     0 
     1 

これら2つの値の合計が0 + 1 = 1です:

SQL> SELECT SUM(R) 
    2 FROM (SELECT 0 AS R FROM DUAL 
    3   UNION 
    4   SELECT 1 AS R FROM DUAL 
    5  ); 

    SUM(R) 
---------- 
     1 

SQL> 
関連する問題