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

Pat*_*ick 1 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
Run Code Online (Sandbox Code Playgroud)

如果两个选择返回相同的值,则结果是具有该值的单个行.如果选择返回不同的值,则结果为具有两个值的两行.为什么?

我试图使用以下方法查找行的总数:

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
Run Code Online (Sandbox Code Playgroud)

如果计数不同,它会按预期工作但如果计数相同则给出一半的值...

(PS:更感兴趣的是为什么sql的行为方式比解决方案更好)

Meh*_*ari 9

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

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

  • @Geoffrey:我在设计SQL时并不存在,但我可以猜测:关系演算基于集合论,SQL基本上是表达关系演算查询的语法.基本上,`union`是`intersect`的对应物,两者都是理论运算.对于设计人员来说,保持它们是有意义的,并为此目的引入一个单独的查询运算符`union all`. (4认同)