采取以下声明:
select count( 1 ) as cnt from tbl where val= 1
union
select count( 1 ) as cnt from tbl where val = 0
如果两个选择返回相同的值,则结果是具有该值的单个行。如果选择返回不同的值,则结果为具有两个值的两行。为什么呢?
我试图使用以下方法查找行总数:
select sum (cnt) from
(
select count( 1 ) as cnt from tbl where value = 1
union
select count( 1 ) as cnt from tbl where value = 0
) as tbl2
如果计数不同,按预期工作,但如果计数相同则给出一半的值......
(PS:对于为什么sql的行为方式比解决方案更感兴趣)
答案 0 :(得分:9)
此行为是设计使然。您应该使用UNION ALL
来实现您想要的行为。基本上,UNION
执行集合并操作,删除集合中的重复项。
答案 1 :(得分:1)
union和union all之间的主要区别在于union对返回的所有字段都有不同的区别。 union all只返回并加入各种结果集