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

10-265 差集合をマルチテーブルインサート

SQLパズル

TableA      TableB
ID  Val     ID  Val
--  ----    --  ----
 1  AAAA     1  XXXX
 2  BBBB     3  YYYY
 4  DDDD     4  ZZZZ
 5  EEEE

IDをプライマリキーとして、
TableBにあるが、TableAにない行を、ValをnullとしてTableAにinsertする。また、
TableAにあるが、TableBにない行を、ValをnullとしてTableBにinsertする。

追加結果
TableA       TableB
ID  Val      ID  Val
--  ----     --  ----
 1  AAAA      1  XXXX
 2  BBBB      2  null
 3  null      3  YYYY
 4  DDDD      4  ZZZZ
 5  EEEE      5  null


データ作成スクリプト

create table TableA(ID Primary key,Val) as
select 1,'AAAA' from dual union
select 2,'BBBB' from dual union
select 4,'DDDD' from dual union
select 5,'EEEE' from dual;

create table TableB(ID Primary key,Val) as
select 1,'XXXX' from dual union
select 3,'YYYY' from dual union
select 4,'ZZZZ' from dual;


SQL

insert first
when aID is null then into TableA(ID,Val) values (bID,null)
when bID is null then into TableB(ID,Val) values (aID,null)
select a.ID as aID, b.ID as bID
  from TableA a full Join TableB b
    on a.ID=b.ID;


解説

AとBの和集合を完全外部結合で求めてから、
   _    _
A∩B と A∩B を、マルチテーブルインサートしてます。

2-1-1 マルチテーブルインサート
8-52 ピボット選択インサート
@IT SQLクリニック 1つのSQL文で複数の表にINSERTする絶品テクニック