为什么我的SQL Union查询返回的值不同于我的手动SELECT WHERE查询?

时间:2013-07-05 19:08:20

标签: sql database tsql sql-server-2012

我使用这个sql代码查询表(我的表有NULL值):

SELECT x.f1,Count(x.f1) FROM
(SELECT p1 As F1 FROM table
 UNION ALL
 SELECT p2 As F1 FROM table
 UNION ALL
 SELECT p3 As F1 FROM table) x
GROUP BY x.f1

此代码解决了该用户提出的问题: SQL, count in multiple columns then group by

但是,当我手动测试表中某个项目在所有列上使用此语句的计数数量时:

WHERE col1 or col2 or col3, etc = 'entry name' 

,与union查询一样,我得到的条目数不同。联合查询要么超过手动查询的数量,要么等于手动查询(我想要的)。例如,对于某个条目,手动查询将返回2,并且联合查询将返回4.

我意识到这个问题有点模糊,因为我无法透露我的表信息或我的确切查询,但我想知道我是否遗漏了一些重要的东西。谢谢!

PS。我正在使用MS SQL server 2012

编辑:示例(取自之前用户的帖子),以澄清:

来源数据表:

P1  P2  P3
-----------
a   b   
a   a   a
b   c   
a   b   b
b   a

我希望它显示如下:

所需的查询输出:

     Total
   -------------
a |    6
b |    5
c |    1

对MY表使用上面的UNION查询代码,我将得到12作为'a'的总计数。使用我的手动查询:

SELECT *
FROM TABLE
WHERE P1 = 'a' OR P2 = 'a' OR P3 ='a'

,总计数我会得到6分。

我的问题是,两个查询都不应该返回相同的值吗?

3 个答案:

答案 0 :(得分:3)

首先,没有理由认为这两个查询会返回类似的结果。具有where子句的那个是计数行,而不管匹配的数量。具有union all的人可以将每行最多计算三次,具体取决于p1p2p3中的值。

要使用union all计算行数,您需要一个ID来标识每一行。然后,您可以在外部查询中使用count(distinct id)

答案 1 :(得分:1)

col1 or col2 or col3, etc = 'entry name'不是正确的语法。它只检查col1col2是否有任何值。仅根据实际值'entry name'检查列表中的最后一个。

答案 2 :(得分:0)

UNION方式在表中运行三次以查找匹配项,如果它在多个列中具有匹配值,则将对同一行计数两次。 OR方式仅在表格中运行一次,不会重复计算任何内容。

请记住,UNION不符合您的条件;它结合了来自每个组件查询的实际行输出。这与使用OR完全不同。