统计所有唯一和现有记录

时间:2014-05-15 01:14:09

标签: sql sql-server sql-server-2008 count

成员

ID    MemberID    UserID    UserID2
1     7           1         0
2     6           4         1
3     4           6         12
4     2           8         18
5     1           1         4
6     3           7         0

我使用了这个SQL语句:

SELECT COUNT(DISTINCT CHECKSUM(UserID,UserID))FROM Membership

但我只得到6

我想获得UserID和UserID2列的所有唯一记录。

1,4,6,7,8,12,18(不包括0)= 7

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

如果您想计算不同的值,请先尝试union all

select count(distinct UserId)
from ((select UserId from MemberShip
      ) union all
      (select UserId2 from Membership
      )
     ) mu
where UserId <> 0;

编辑:

评论中提到了以下版本:

select count(*)
from ((select UserId from MemberShip
      ) union
      (select UserId2 from Membership
      )
     ) mu
where UserId <> 0;

我更喜欢union all版本,因为我通常会尽可能避免使用union。删除重复项的额外步骤总是会产生额外的性能 - 虽然在这里很有用,但通常不需要它。这就是我更喜欢union all版本的原因。

虽然不简单(在我看来),但这个版本在某些数据库中有一个可能的小优势。如果Membership表在UserIdUserId2上有单独的索引,则更容易利用这些索引进行查询。请注意,这消除了重复数据删除(因为需要对两列中的用户列表进行去除),但它确实(可能)减少了重复数据删除中的成员数量步骤