选择0行和选择20745之间的UNION给出20740

时间:2015-09-04 08:57:07

标签: sql sql-server sql-server-2008 select union

在SQL Server 2008中,我有一种我不理解的行为。

我在两个选择语句之间做UNION

  • 首先选择返回20745行
  • 第二个选择返回0行

当我在两个选项中使用union时,我得到20740行,我会看到20745,因为union只返回不同的值。

为了获得例外结果,我使用了union all,但有一些我不了解它。有人有解释吗?

3 个答案:

答案 0 :(得分:2)

您的第一个SELECT语句中必须有重复的行。请注意,UNION可以消除结果集中的重复项。

如果要返回所有行,请改用UNION ALL

示例:

--UNION ALL
WITH TableA(n) AS (
    SELECT * FROM (
        VALUES(1),(2),(3),(4),(1)
    )t(n)
),
TableB(n) AS (
    SELECT * FROM (
        VALUES(10),(20),(30),(40)
    )t(n)
)
SELECT n FROM TableA UNION ALL
SELECT n FROM TableB

以上将返回:

n
-----------
1
2
3
4
1
10
20
30
40

UNION变体

SELECT n FROM TableA UNION
SELECT n FROM TableB

将返回:

n
-----------
1
2
3
4
10
20
30
40

答案 1 :(得分:2)

union会删除重复的结果,无论它们来自两个不同的select还是来自同一个。union all。如果您想保留重复的内容,请改用SELECT * FROM table1 UNION ALL SELECT * FROM table2

insertRowAtIndexPath

答案 2 :(得分:1)

第一个选择语句有重复:)这是正常行为。

尝试在第一个select语句中添加一个distinct - 它也应该返回20740行。

这应该有助于您更好地了解正在发生的事情。