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

7-45 部分一致する最大のレコードと結合

SQLパズル

Table745    マスタ745
ID          ID   Val1  Val2
-------     ---  ----  ----
abczzz      ab      3  AAAA
abcdzz      cd      6  BBBB
abcdef      def     9  CCCC

Table745と、マスタ745を
IDが部分一致するなかで、Val1が最大のデータと結合させる。

出力結果
ID      Val1  Val2
------  ----  ----
abczzz     3  AAAA
abcdzz     6  BBBB
abcdef     9  CCCC


データ作成スクリプト

create table Table745(ID char(6));
insert into Table745 values('abczzz');
insert into Table745 values('abcdzz');
insert into Table745 values('abcdef');

create table マスタ745(
ID varchar2(3),
Val1 number(1),
Val2 char(4));

insert into マスタ745 values('ab' ,3,'AAAA');
insert into マスタ745 values('cd' ,6,'BBBB');
insert into マスタ745 values('def',9,'CCCC');
commit;


SQL

--■■■Row_Number関数を使う方法■■■
select ID,Val1,Val2
from (select a.ID,b.Val1,b.Val2,
      Row_Number() over(partition by a.ID order by Val1 desc) as rn
        from Table745 a,マスタ745 b
       where instr (a.ID,b.ID) > 0)
 where Rn = 1
order by ID;

--■■■Last_Value関数を使う方法■■■
select a.ID,b.Val1,b.Val2
from Table745 a,マスタ745 b
where b.RowID = (select distinct
                 Last_Value(c.RowID)
                 over(order by Val1 Rows between Unbounded Preceding and Unbounded Following)
                 from マスタ745 c
                 where instr(a.ID,c.ID) > 0)
order by a.ID;


解説

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