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

8-30 Oracle8iの外部結合で論理和

SQLパズル

MasterTable    SubTable
ID             ID  Val
--             --  ---
 1              1   10
 2              2   20
 3              3   10
 4              3   20
 5              4   50

下記の外部結合と同じ結果を、Oracle8iの外部結合で取得する。

select a.ID,b.Val
  from MasterTable a Left Join SubTable b
    on a.ID = b.ID
   and b.Val in (10,20);

出力結果
ID   Val
--  ----
 1    10
 2    20
 3    10
 3    20
 4  null
 5  null

SQLクックブックのレシピ11.3を参考にさせていただきました


データ作成スクリプト

create table MasterTable(ID) as
select 1 from dual union
select 2 from dual union
select 3 from dual union
select 4 from dual union
select 5 from dual;

create table SubTable(ID,Val) as
select 1,10 from dual union
select 2,20 from dual union
select 3,10 from dual union
select 3,20 from dual union
select 4,50 from dual;


SQL

select a.ID,b.Val
  from MasterTable a,SubTable b
 where a.ID = b.ID(+)
   and 1 = decode(b.Val(+),10,1,20,1);


解説

decode関数で、論理和を代用しています。