2015-10-19 112 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是否會使用該索引進行重複刪除。如果每個表都有很多重複項,這可能會對性能產生很大影響。 –

相關問題