SQL挑战:为什么SQL查询不按NULL分组
我想在这里挑战SQL社区。让我们使用以下数据和SQL查询: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
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时的大小写!=空然后“是”或者“不”结束,因为它不等于空,这似乎不是一个挑战。我试过一个误导性的标题,但它不起作用:好吧,这似乎不是一个挑战。我尝试了一个误导性的标题,但没有成功: