SQL挑战:为什么SQL查询不按NULL分组

Rad*_*ača 1 sql sql-server

我想在这里挑战SQL社区.让我们拥有以下数据和SQL查询:

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
Run Code Online (Sandbox Code Playgroud)

为什么SQL查询没有将NULL的值相加?换句话说,为什么我们得到

a_id    Bsum
---------------
NULL    NULL
1       220
3       NULL
Run Code Online (Sandbox Code Playgroud)

代替

a_id    Bsum
---------------
NULL    200
1       220
3       NULL
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

这与此无关sum().原因是比较left join的方式和方法NULL.这是您的查询:

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;
Run Code Online (Sandbox Code Playgroud)

在行所在的a_id位置NULL,=求值为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;
Run Code Online (Sandbox Code Playgroud)