Je voudrais défier la communauté SQL ici. Laissez-nous avoir datatables suivantes et la requête 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
Pourquoi la requête SQL ne sum-t-elle pas la valeur de la valeur NULL? En d'autres termes, pourquoi nous obtenons
a_id Bsum --------------- NULL NULL 1 220 3 NULL
au lieu de
a_id Bsum --------------- NULL 200 1 220 3 NULL
Cela n'a rien à voir avec la sum()
. La raison est la left join
et la façon dont NULL
fonctionne pour les comparaisons. Ceci est votre requête:
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;
Sur les lignes où a_id
est NULL
, the =
évalue à NULL
– ce qui n'est pas vrai. Ce que vous semblez vouloir, c'est:
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;