SQL:UNION与使用UNION ALL子查询

时间:2016-01-19 16:35:05

标签: sql database

这两个SQL语句在所有场景中是否相同?

SELECT DISTINCT * FROM 
(SELECT * FROM tablename UNION ALL SELECT * FROM tablename2) dummyname

SELECT * FROM tablename UNION SELECT * FROM tablename2

我总是觉得UNION特有的一点就是它删除了所有非不同的行,即使这些非不同的行出现在UNION子句的单个部分中。例如,假设tablename有一列:amt INT。假设INT不是主键,并且没有任何唯一约束。那么假设我有两行,其中amt = 20.无论我做什么UNION,这两行中只有一行会出现在结果集中。

我向其他人解释了这种行为,然后想出了上面的例子来证明UNION的行为......我相信上面的两个陈述是相同的(总是),但我只想确保我说是对的。是否存在上述两个SQL语句不会生成完全相同的结果集的边缘情况?

2 个答案:

答案 0 :(得分:4)

这两个版本完全相同:UNION在功能上等同于SELECT DISTINCT上的UNION ALL

UNION删除表中的重复值以及两个表之间共享的值。

我应该注意,从性能的角度来看,以下内容通常比UNION更快:

select distinct t.col1, t.col2
from t
union
select distinct t1.col1, t.col2
from t1;

这可能违反直觉。但是,如果表中的(col1, col2)上有索引,则可以将其用于select distinct,从而减​​少union的行数。一些优化者可能会错过这个简化输入的机会。

答案 1 :(得分:1)

简而言之,您可以找到解释here

/* Declare First Table */
DECLARE @Table1 TABLE (ColDetail VARCHAR(10))
INSERT INTO @Table1
SELECT 'First'
UNION ALL
SELECT 'Second'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fourth'
UNION ALL
SELECT 'Fifth'
/* Declare Second Table */
DECLARE @Table2 TABLE (ColDetail VARCHAR(10))
INSERT INTO @Table2
SELECT 'First'
UNION ALL
SELECT 'Third'
UNION ALL
SELECT 'Fifth'

SELECT DISTINCT * FROM (SELECT * FROM @Table1 UNION ALL SELECT * FROM @Table2) dummyname

结果1:

enter image description here

SELECT * FROM @Table1 UNION SELECT * FROM @Table2

结果2:

enter image description here