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

SQL挑战:为什么SQL查询不按NULL分组,sql,sql-server,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 v

我想在这里挑战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
为什么SQL查询不求NULL值的和?换句话说,为什么我们会

a_id    Bsum
---------------
NULL    NULL
1       220
3       NULL
而不是

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

这与总数无关。原因是左连接和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;
在_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;

这与总数无关。原因是左连接和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;
在_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;

关于空值。这将有助于您理解为什么它没有分组。将A.A_id=B.A_id上的左join B更改为isnullA.A_id,-1=isnullB.A_id,-1(在on子句中)和nulliffA.A_id,-1(在SELECT中)将得到它。On NULL不能等于或不等于另一个NULL,即。质询:您认为以下查询的结果是什么:选择NULL=NULL时的大小写,然后选择“确定”否则“否”结束,如同\u NULL\u equal\u nullChallenge 2:预测以下查询的结果:选择NULL时的大小写!=空,然后“是”或者“不”结束,因为关于空值,不等于。这将有助于您理解为什么它没有分组。将A.A_id=B.A_id上的左join B更改为isnullA.A_id,-1=isnullB.A_id,-1(在on子句中)和nulliffA.A_id,-1(在SELECT中)将得到它。On NULL不能等于或不等于另一个NULL,即。质询:您认为以下查询的结果是什么:选择NULL=NULL时的大小写,然后选择“确定”否则“否”结束,如同\u NULL\u equal\u nullChallenge 2:预测以下查询的结果:选择NULL时的大小写!=空然后“是”或者“不”结束,因为它不等于空,这似乎不是一个挑战。我试过一个误导性的标题,但它不起作用:好吧,这似乎不是一个挑战。我尝试了一个误导性的标题,但没有成功: