如果数据不同,Union返回两行,如果相同,则返回一行!为什么?

时间:2011-01-11 10:59:49

标签: sql sql-server-2008

采取以下声明:

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的行为方式比解决方案更感兴趣)

2 个答案:

答案 0 :(得分:9)

此行为是设计使然。您应该使用UNION ALL来实现您想要的行为。基本上,UNION执行集合并操作,删除集合中的重复项。

http://www.fmsinc.com/free/NewTips/SQL/SQLtip5.asp

答案 1 :(得分:1)

union和union all之间的主要区别在于union对返回的所有字段都有不同的区别。 union all只返回并加入各种结果集