当另一半为 null 时,Union 会从查询的一半中删除行



有人可以解释为什么如果我运行下面的查询,行没有从联合的上半部分正确添加吗? 我以为工会只消除了重复,而不是价值观? 如果我把它全部联合起来,它会修复它,我只是不确定为什么需要它? 谢谢,jb

CREATE TABLE #c3 (idNbr int, idValue int, idP int);
insert into #c3 (idNbr, idValue, idP) select 1 , 1 , 1 ;
insert into #c3 (idNbr, idValue, idP) select 1 , 1 , 1 ;
insert into #c3 (idNbr, idValue, idP) select 1 , 1 , 1 ;
CREATE TABLE #c4 (idNbr int, idValue int, idP int);
insert into #c4 (idNbr, idValue, idP) select 1 , 1 , 2 ;
select rs.idNbr, sum(rs.id1Tot)idTot, sum(rs.id2Tot) idTot2 from (
    select idNbr, idvalue id1Tot, 0 id2Tot from #c3 where idP=1
     union  
    select idNbr, 0 idTot, idvalue id2Tot from #c4 where idP=1
    )rs  group by rs.idNbr
drop table #c3
drop table #c4

UNION将两个表中的所有行放在一个表中,然后从结果中删除重复项。它不仅查看第二个表的行来查找第一个表中是否已存在此类行。

换句话说,当UNION消除重复项时,它并不关心行来自哪个表。T1 UNION T2的结果与T2 UNION T1相同。

在您的示例中,UNION运算符的第一个表具有三个相同的行。

1, 1, 1
1, 1, 1
1, 1, 1

UNION运算符的第二个表为空。

UNION将三行和零行放在一起:

1, 1, 1
1, 1, 1
1, 1, 1

然后从此结果中删除重复项,只留下一行:

1, 1, 1

然后计算该行的摘要。


UNION ALL不会消除任何东西,所以如果你使用 UNION ALL ,它的结果是三行

1, 1, 1
1, 1, 1
1, 1, 1

然后进入摘要。

最新更新