我有如下表:獲得來自匹配記錄驅除掉,並添加不等於數據
表一:
Name
T1
T2
T3
T4
表B:
Name
T1
T2
T3
T4
T5
T6
我需要從表中的所有選擇a並添加表b中未列出的a,結果如下:
T1
T2
T3
T4
T5
T6
感謝您的幫助
我有如下表:獲得來自匹配記錄驅除掉,並添加不等於數據
表一:
Name
T1
T2
T3
T4
表B:
Name
T1
T2
T3
T4
T5
T6
我需要從表中的所有選擇a並添加表b中未列出的a,結果如下:
T1
T2
T3
T4
T5
T6
感謝您的幫助
我會用反連接(NOT IN條件)。如下所述,如果在表a
的該列中可能有NULL
(在這種情況下,應該使用NOT EXISTS
條件寫入反連接),它將無法正常工作。我假設該列是NOT NULL
。
反連接速度比連接快,因爲只要a
中的表b
的值也找到,表格b
的那一行的連接就停止並且處理移動到下一行。在一次加入中,加入繼續,沒有這種短路。
Oto的解決方案使用連接而不是反連接。但是,我相信在這種簡單的情況下,Oracle查詢優化器可以識別出反連接是足夠的,並且它會重寫查詢以使用反連接。這可以通過在兩個查詢上運行解釋計劃來驗證。有了這個說法,在類似但更復雜的問題中,優化器可能無法「看到」這個快捷方式;這就是爲什麼我相信最好寫明反連接(和半連接,我們使用IN
或EXISTS
條件),而不是依賴優化器。
查詢應該是
select name from a
union all
select name from b where name not in (select name from a);
下面是做到這一點的一種方法:
Select distinct Name
from (
select Name from Table A
UNION ALL
select Name from Table B
)
雖然準確,但這是不必要的複雜,因爲一個簡單的'聯合'做同樣的事情。 –
謝謝傑里米,有沒有其他的方式,有不同的緩慢 –
感謝所有不同的方法。對於mathguy:謝謝,我會測試它,看起來不錯。 –
如果你想從兩個表中的所有獨特的名稱,使用UNION
:
select name from table_a
union
select name from table_b;
這裏是另一種方式:
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
這可能是最快的方法。 –
如表一有重複?如果表a中有重複,你是否希望結果也具有相同的重複項?表b如何? – GurV
這兩個表中都沒有重複。 –