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

10-221 内部結合して値を比較

SQLパズル

Tab1                 Tab2
Key  Val1  Val2      Key  Val1  Val2
---  ----  ----      ---  ----  ----
AAA   111   111      AAA   111   111
BBB   111   111      BBB   111   222
CCC   111   111      CCC   222   111
DDD   111   111      DDD   222   222

Tab1とTab2を、Keyで紐づけて比較して、
Val1が等しく    、Val2も等しい場合は、     compに0
Val1が等しく    、Val2も等しくない場合は、 compに1
Val1が等しくなく、Val2も等しい場合は、     compに2
Val1が等しくなく、Val2も等しくない場合は、 compに3

を出力する。

出力結果
Key  Val1  Val2  comp
---  ----  ----  ----
AAA   111   111     0
BBB   111   222     1
CCC   222   111     2
DDD   222   222     3

こちらを参考にさせていただきました


データ作成スクリプト

create table tab1(
Key  char(3),
Val1 number(3),
Val2 number(3));

create table tab2 as select * from tab1 where RowNum=0;

insert all
into Tab1(Key,Val1,Val2) values('AAA',111,111)
into Tab1(Key,Val1,Val2) values('BBB',111,111)
into Tab1(Key,Val1,Val2) values('CCC',111,111)
into Tab1(Key,Val1,Val2) values('DDD',111,111)
into Tab2(Key,Val1,Val2) values('AAA',111,111)
into Tab2(Key,Val1,Val2) values('BBB',111,222)
into Tab2(Key,Val1,Val2) values('CCC',222,111)
into Tab2(Key,Val1,Val2) values('DDD',222,222)
select 1 from dual;
commit;


SQL

select b.Key,b.Val1,b.Val2,
case when a.Val1  = b.Val1 and a.Val2  = b.Val2 then 0
     when a.Val1 != b.Val1 and a.Val2  = b.Val2 then 1
     when a.Val1  = b.Val1 and a.Val2 != b.Val2 then 2
     else 3 end as comp
  from Tab1 a,Tab2 b
 where a.Key = b.Key;


解説

case式で、場合分けを行ってます。

Val1が等しい場合と、等しくない場合があり、
Val2が等しい場合と、等しくない場合があり、
和の法則と積の法則により
(1+1)*(1+1)=2*2=4
で4通りの場合があります。

なぜ場合分けが必要か
【第254回】和の法則
【第255回】積の法則