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

5-11 最大値のデータと外部結合

SQLパズル

TabA
Key1   Data1
----   -----
   1       2
   2       2
   3       1

TabB
Key1  Key2  Data2
----  ----  -----
   1     4      p
   1     8      f
   3     3      q

TabA.Key1=TabB.Key1の関係ですが、必ずしも結合出来るデータがあるとは限りません。
TabBに結合できるデータが複数ある時は、Key2が一番大きい値のデータが取得する。

出力結果
Key1   Key2   Data1   Data2
----   ----   -----   -----
   1      8       2       f
   2   NULL       2    null
   3      3       1       q


データ作成スクリプト

create table TabA(
Key1  char(1),
Data1 char(1));

create table TabB(
Key1  char(1),
Key2  char(1),
Data2 char(1));

insert into TabA values('1','2');
insert into TabA values('2','2');
insert into TabA values('3','1');
insert into TabB values('1','4','p');
insert into TabB values('1','8','f');
insert into TabB values('3','3','q');
commit;


SQL

--■■■select句で相関サブクエリを使用する方法■■■
select Key1,
(select max(b.Key2) from TabB b where b.Key1=a.Key1) Key2,
Data1,
(select b.Data2 from TabB b where b.Key1=a.Key1
                              and b.Key2=(select max(c.Key2) from TabB c
                                           where c.Key1=b.Key1)) as Data2
from TabA a;

--■■■max関数を使用する方法■■■
select a.Key1,b.Key2,a.Data1,b.Data2
from TabA a,
(select Key1,Key2,Data2 from TabB bb
  where bb.Key2 = (select max(cc.Key2) from TabB cc
                    where cc.Key1=bb.Key1)) b
where a.Key1=b.Key1(+);

--■■■分析関数を使用する方法1■■■
select a.Key1,b.Key2,a.Data1,b.Data2
from TabA a,
(select Key1,Key2,Data2 from (
    select Key1,Key2,Data2,max(Key2) over(partition by Key1) as max_Key2 from TabB bb)
 where Key2 = max_Key2) b
where a.Key1=b.Key1(+);

--■■■分析関数を使用する方法2■■■
select a.Key1,b.Key2,a.Data1,b.Data2
from TabA a
Left Join (select Key1,Key2,Data2,max(Key2) over(partition by Key1) as max_Key2 from TabB) b
  on (b.Key2 = b.max_Key2 and a.Key1=b.Key1);


解説

1対1の結合なので、select句での相関サブクエリで取得できます。