2017-05-07 25 views
0

我有如下表:獲得來自匹配記錄驅除掉,並添加不等於數據

表一:

Name 

T1  
T2  
T3 
T4 

表B:

Name 
T1  
T2  
T3 
T4 
T5 
T6 

我需要從表中的所有選擇a並添加表b中未列出的a,結果如下:

T1  
T2  
T3 
T4 
T5 
T6 

感謝您的幫助

+0

如表一有重複?如果表a中有重複,你是否希望結果也具有相同的重複項?表b如何? – GurV

+0

這兩個表中都沒有重複。 –

回答

0

我會用反連接(NOT IN條件)。如下所述,如果在表a的該列中可能有NULL(在這種情況下,應該使用NOT EXISTS條件寫入反連接),它將無法正常工作。我假設該列是NOT NULL

反連接速度比連接快,因爲只要a中的表b的值也找到,表格b的那一行的連接就停止並且處理移動到下一行。在一次加入中,加入繼續,沒有這種短路。

Oto的解決方案使用連接而不是反連接。但是,我相信在這種簡單的情況下,Oracle查詢優化器可以識別出反連接是足夠的,並且它會重寫查詢以使用反連接。這可以通過在兩個查詢上運行解釋計劃來驗證。有了這個說法,在類似但更復雜的問題中,優化器可能無法「看到」這個快捷方式;這就是爲什麼我相信最好寫明反連接(和半連接,我們使用INEXISTS條件),而不是依賴優化器。

查詢應該是

select name from a 
union all 
select name from b where name not in (select name from a); 
0

下面是做到這一點的一種方法:

Select distinct Name 
from (
select Name from Table A 
UNION ALL 
select Name from Table B 
) 
+0

雖然準確,但這是不必要的複雜,因爲一個簡單的'聯合'做同樣的事情。 –

+0

謝謝傑里米,有沒有其他的方式,有不同的緩慢 –

+0

感謝所有不同的方法。對於mathguy:謝謝,我會測試它,看起來不錯。 –

2

如果你想從兩個表中的所有獨特的名稱,使用UNION

select name from table_a 
union 
select name from table_b; 
1

這裏是另一種方式:

select ta.name from ta 
union all 
select tb.name from tb 
left join ta 
on tb.name = ta.name 
where ta.name is null 
+0

這可能是最快的方法。 –