2017-07-26 6 views
1

ここでSQLコミュニティに挑戦したいと思います。SQLチャレンジ:SQLクエリがNULLに従ってグループ化しない理由

create table A 
(
    a_id integer unique, 
    code int 
); 

create table B 
(
    a_id integer foreign key references A(a_id), 
    b_count int 
); 

insert into A values (1, 20); 
insert into A values (3, 30); 
insert into A values (null, 30); 

insert into B values (1, 100); 
insert into B values (1, 120); 
insert into B values (null, 200); 

select A.a_id, sum(B.b_count) Bsum 
from A 
left join B on A.a_id = B.a_id 
group by A.a_id 

なぜ、SQLクエリでNULLの値が合計されないのですか?言い換えれば、なぜ我々は

a_id Bsum 
--------------- 
NULL NULL 
1  220 
3  NULL 

代わりの

a_id Bsum 
--------------- 
NULL 200 
1  220 
3  NULL 
+0

[記事](https://technet.microsoft.com/en-us/library/ms191504(V = SQL.105).aspxの) 'NULL'値について。それはグループ化されていない理由を理解するのに役立ちます。 – Rokuto

+0

on節とnulliff(A.a_id、-1)のisnull(A.a_id、-1)= isnull(B.a_id、-1)にA.a_id = B.a_idの左結合Bを変更し、あなたはそれを得るでしょう。 NULL上では、NULLは他のNULLと等しくなくてはなりません。 – sepupic

+1

課題:次のクエリの結果はどうなると思いますか? 'nullをヌルにしてから '確かに' else 'をノーエンドとします。 – LukStorms

答えて

5

これはsum()とは何の関係もありません取得します。理由はleft joinであり、比較のためにはNULLの方法があります。 - 真実ではないとするa_idNULLある行に

select A.a_id, sum(B.b_count) Bsum 
from A left join 
    B 
    on A.a_id = B.a_id 
group by A.a_id; 

=NULLと評価されます。これはあなたのクエリです。何がしたいように見えることである:

select A.a_id, sum(B.b_count) Bsum 
from A left join 
    B 
    on A.a_id = B.a_id or (A.a_id is null and B.a_id is null) 
group by A.a_id; 
+0

もう一度、あなたはどこにいようと速いのですか?:-) –

+0

大丈夫、それは挑戦ではなかったようです。私は誤解を招くタイトルを試しましたが、うまくいかなかった:) –

関連する問題