トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
7-77 優先順位のあるデータ取得
SQLパズル
TranTable MasterTable
PKey PKey Fld
---- ---- ----
AA-1 AA AAAA
AA-2 AA-3 BBBB
AA-3 BB CCCC
BB-1 BB-1 DDDD
BB-2 BB-2 EEEE
CC-1 CC FFFF
CC-2
TranTableのPKeyに紐づく、MasterTableのFldを取得する。
TranTableのPKeyに紐づくデータが存在しない場合は、
MasterTableのPKeyと先頭2文字が一致するデータのFldを取得する。
出力結果
KEY1 FLD1
---- ----
AA-1 AAAA
AA-2 AAAA
AA-3 BBBB
BB-1 DDDD
BB-2 EEEE
CC-1 FFFF
CC-2 FFFF
データ作成スクリプト
create table TranTable(PKey varchar2(4) primary key);
create table MasterTable(
PKey varchar2(4) primary key,
Fld varchar2(4));
insert all
into TranTable values('AA-1')
into TranTable values('AA-2')
into TranTable values('AA-3')
into TranTable values('BB-1')
into TranTable values('BB-2')
into TranTable values('CC-1')
into TranTable values('CC-2')
into MasterTable values('AA' ,'AAAA')
into MasterTable values('AA-3','BBBB')
into MasterTable values('BB' ,'CCCC')
into MasterTable values('BB-1','DDDD')
into MasterTable values('BB-2','EEEE')
into MasterTable values('CC' ,'FFFF')
select 1 from dual;
commit;
SQL
--■■■First_Value関数を使う方法■■■
select PKey,
(select distinct First_Value(b.Fld)
over(order by case when b.PKey = a.PKey then 0
when b.PKey = substr(a.PKey,1,2) then 1 end)
from MasterTable b) as Fld
from TranTable a
order by PKey;
--■■■2回外部結合させる方法■■■
select a.PKey,nvl(b.Fld,c.Fld) as Fld
from TranTable a
Left Join MasterTable b on (b.PKey = a.PKey)
Left Join MasterTable c on (c.PKey = substr(a.PKey,1,2))
order by PKey;
解説