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

3-27 full joinとunionの相互変換

SQLパズル

TableA              TableB
ColA  ColB  ColC    ColA  ColB  ColC
----  ----  ----    ----  ----  ----
   1  aaaa  1000       1  eeee  5000
   2  bbbb  2000       2  ffff  6000
   3  cccc  3000       5  gggg  7000
   4  dddd  4000       6  hhhh  8000

TableAの全てのレコードと、
TableAにColAが等しいレコードが存在しない、TableBのレコードを出力する。

TableAのキーは、ColAとし、
TableBのキーも、ColAとする

出力結果
ColA  ColB  ColC
----  ----  ----
   1  aaaa  1000
   2  bbbb  2000
   3  cccc  3000
   4  dddd  4000
   5  gggg  7000
   6  hhhh  8000


データ作成スクリプト

create table TableA(
ColA number(1),
ColB varchar2(10),
ColC number(4),
primary key(ColA));

create table TableB(
ColA number(1),
ColB varchar2(10),
ColC number(4),
primary key(ColA));

insert into TableA values(1,'aaaa',1000);
insert into TableA values(2,'bbbb',2000);
insert into TableA values(3,'cccc',3000);
insert into TableA values(4,'dddd',4000);

insert into TableB values(1,'eeee',5000);
insert into TableB values(2,'ffff',6000);
insert into TableB values(3,'gggg',7000);
insert into TableB values(4,'hhhh',8000);
commit;


SQL

--■■■unionを使う方法■■■
select ColA,ColB,ColC
  from TableA
union all
select ColA,ColB,ColC
  from TableB b
 where not exists(select 1 from TableA a
                   where b.ColA = a.ColA);

--■■■完全外部結合を使う方法■■■
select nvl(a.ColA,b.ColA) as ColA,
nvl2(a.ColA,a.ColB,b.ColB) as ColB,
nvl2(a.ColA,a.ColC,b.ColC) as ColC
  from TableA a full join TableB b
    on a.ColA=b.ColA;


解説

完全外部結合による和集合と、
unionでの和集合は、
ベン図が一緒なので、
SQLを書き換えれることがあります

数学での集合が等しいことの必要十分条件は、
要素数が等しく、かつ、互いの要素を含むこと
ですが、
ベン図が同じであれば、要素数が等しいので、
あとは要素によっては、同値なSQLに書き換え可能になるのです

数学の集合は重複を許可しないけど、
SQLでは重複を許可するといった問題もありますが

集合の一致