2015-10-19 109 views
0

我有2个单独的查询,它们只是基本的选择,都返回一个不同的int列。然后,我需要将这两个ints列表结合在一起,以产生一个最终的单独列表。从2个不同的int列表中获取不同的int列表

有没有更快的方法来做到这一点比以下?

SELECT DISTINCT ID 
FROM dbo.Test 

UNION 

SELECT DISTINCT ID 
FROM dbo.Test2 
+6

当它是一个UNION时,不需要做SELECT DISTINCT。 (由于UNION删除所有重复项。) – jarlh

+2

从两个查询中删除'DISTINCT',这是'union'所做的。 –

+0

@vpk:'union all'确实比'union'更快,但它不会消除重复值:-) – dnoeth

回答

4

如果你没有在每个表中重复,再下面是可能更快:

select id 
from dbo.test 
union all 
select id 
from dbo.test1 t1 
where not exists (select 1 from dbo.test t where t.id = t1.id); 

对于这一点,你要对test(id)的索引。

即使有重复,下面是可能会更快:

select distinct id 
from dbo.test 
union all 
select distinct id 
from dbo.test1 t1 
where not exists (select 1 from dbo.test t where t.id = t1.id); 

这需要两个test(id)test1(id)指标。这个想法是索引被扫描以返回id。

1

我认为在你的情况下,最快的方法是删除这两个DISTINCT因为UNION将删除所有重复整体反正:

SELECT ID 
FROM dbo.Test 

UNION 

SELECT ID 
FROM dbo.Test2 

注意两个DISTINCT■不要确保整个唯一无论如何,这两个序列就是UNION所做的。如果你不需要/想要独特的元素使用UNION ALL

+0

我认为这不一定更快。如果这两个表有'id'上的索引,我不确定SQL Server是否会使用该索引进行重复删除。如果每个表都有很多重复项,这可能会对性能产生很大影响。 –

相关问题