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

7-44 最長一致の原則で結合

SQLパズル

Table744    マスタ744
ID          ID      Val
------      ------  ---
abcdef      abcdef  1
abc123      ab      2
123abc      %%      3
%%aaaa      %%%%%   4

Table744を、マスタ744と、
IDが前方一致することを条件として外部結合して、
ID、Valを出力する。

ただし、前方一致するIDが複数あった場合は、
最長のIDと結合する(最長一致の原則で結合)

出力結果
ID      Val
------  ----
abcdef  1
abc123  2
123abc  null
%%aaaa  3


データ作成スクリプト

create table Table744(ID char(6));
insert into Table744 values('abcdef');
insert into Table744 values('abc123');
insert into Table744 values('123abc');
insert into Table744 values('%%aaaa');

create table マスタ744(
ID  varchar2(6),
Val number(1));

insert into マスタ744 values('abcdef',1);
insert into マスタ744 values('ab'    ,2);
insert into マスタ744 values('%%'    ,3);
insert into マスタ744 values('%%%%%' ,4);
commit;


SQL

select ID,
(select distinct
Last_Value(b.Val) over(order by Length(b.ID)
Rows between Unbounded Preceding and Unbounded Following)
   from マスタ744 b
  where a.ID
   Like replace(replace(replace(b.ID,'\','\\'),'%','\%'),'_','\_') || '%' escape '\') as Val
from Table744 a;


解説

distinctを使って、Last_Value関数の結果の重複を排除して、
スカラー問い合わせになるようにしてます。