这两个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语句不会生成完全相同的结果集的边缘情况?
答案 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:
SELECT * FROM @Table1 UNION SELECT * FROM @Table2
结果2: