有人可以解释为什么如果我运行下面的查询,行没有从联合的上半部分正确添加吗? 我以为工会只消除了重复,而不是价值观? 如果我把它全部联合起来,它会修复它,我只是不确定为什么需要它? 谢谢,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
然后进入摘要。