トップページに戻る
次の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では重複を許可するといった問題もありますが
集合の一致