トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

2-2-3 in述語の引数にサブクエリ

SQLパズル

Table1        Table2
Col1  Col2    Col3  Col4
----  ----    ----  ----
1111  1111    1111  2222
1111  2222    2222  1111
1111  3333    2222  2222
2222  1111    2222  3333
2222  2222
2222  3333

Table1のCol1,Col2の値の組み合わせと同一の組み合わせが、
Table2のCol3,Col4の値の組み合わせの集合の中に存在したら、
Table1の該当レコードをDeleteする。

削除結果
Table1
Col1  Col2
----  ----
1111  1111
1111  3333


データ作成スクリプト

create table Table1(Col1,Col2) as
select 1111,1111 from dual union
select 1111,2222 from dual union
select 1111,3333 from dual union
select 2222,1111 from dual union
select 2222,2222 from dual union
select 2222,3333 from dual;

create table Table2(Col3,Col4) as
select 1111,2222 from dual union
select 2222,1111 from dual union
select 2222,2222 from dual union
select 2222,3333 from dual;


SQL

--■■■in述語を使う方法■■■
delete from Table1
where (Col1,Col2) in(select b.Col3,b.Col4 from Table2 b);

--■■■exists述語を使う方法■■■
delete from Table1 a
 where exists(select 1 from Table2 b
               where a.Col1 = b.Col3
                 and a.Col2 = b.Col4);


解説

in述語の引数には、複数行複数列のselect文を使用できます。

in述語は記述が楽ですが、exists述語のほうがパフォーマンスがいいことが多いので、
in述語が向いているのは、単体テスト用のビューや、データ調査での使い捨てのクエリなどと思います。

in述語とexists述語を、状況によって使い分けるといいでしょう。