2016-12-03 3 views
-4

2つの表があり、同じ行をフェッチする必要はありません。どのようにクエリを書くか?SQL照会で等しくない行を取得する方法

たとえば、table aには10行が含まれ、table bには10行が含まれます。 aとbで 等しい行私は(ないBテーブルで)等しくない行を取りたい5.

ある

Bテーブルに等しくないテーブル値を取得するには?

結果は、構文はINTERSECTに似て

EXCEPT 5のレコード

+0

マイナスが正解を示していません。両方のテーブルに等しくない値を与えます。私はテーブルの値だけを持っています – user2587029

答えて

2

(select * from A union select * from B) minus (select * from A intersect select * from B) 
+0

マイナスは正解を与えていません。両方のテーブルに等しくない値を与えます。私はテーブル値だけを必要とします – user2587029

1

この問題はずっと前に解決されています。最適解は各テーブルを1回だけ読み込みます(各テーブルを2回読み込み、追加の作業を行う「対称差分」解法とは異なります)。

select 'A' as source, col1, col2, ... 
from table_A 
union all 
select 'B' as source, col1, col2, ... 
from table_B 
group by col1, col2, ... 
having count(*) = 1 
; 

行は、両方のテーブルに存在する場合

、次いでカウントこれは、いずれかのテーブルに重複する行が存在しない前提2.

あろう。重複する行がある場合は、HAVING条件を変更できます。たとえば、

having count(case when source = 'A' then 1 end) = 0 
    or count(case when source = 'B' then 1 end) = 0 
関連する問題