Aテーブル Bテーブル
Code Name Code Name2 EndDate
---- ---- ---- ----- ----------
0001 AAAA 0001 GGGG 2004/01/01
0002 BBBB 0001 HHHH 2004/02/02
0003 CCCC 0001 IIII 2004/03/03
0004 DDDD 0002 JJJJ 2004/01/01
0005 EEEE 0002 KKKK 2004/03/03
0005 LLLL 2004/02/02
AテーブルのCodeに紐づくデータを
Bテーブルから取得する(Dateが最大のデータと外部結合する)
出力結果
Code Name Name2
---- ---- -----
0001 AAAA IIII
0002 BBBB KKKK
0003 CCCC null
0004 DDDD null
0005 EEEE LLLL
create Table Aテーブル(
Code char(4),
Name char(4),
primary key(Code));
create Table Bテーブル(
Code char(4),
Name2 char(4),
EndDate date,
primary key(Code,EndDate));
insert into Aテーブル(Code,Name) values('0001','AAAA');
insert into Aテーブル(Code,Name) values('0002','BBBB');
insert into Aテーブル(Code,Name) values('0003','CCCC');
insert into Aテーブル(Code,Name) values('0004','DDDD');
insert into Aテーブル(Code,Name) values('0005','EEEE');
insert into Bテーブル(Code,Name2,EndDate) values('0001','GGGG',to_date('20040101','yyyymmdd'));
insert into Bテーブル(Code,Name2,EndDate) values('0001','HHHH',to_date('20040202','yyyymmdd'));
insert into Bテーブル(Code,Name2,EndDate) values('0001','IIII',to_date('20040303','yyyymmdd'));
insert into Bテーブル(Code,Name2,EndDate) values('0002','JJJJ',to_date('20040101','yyyymmdd'));
insert into Bテーブル(Code,Name2,EndDate) values('0002','KKKK',to_date('20040303','yyyymmdd'));
insert into Bテーブル(Code,Name2,EndDate) values('0005','LLLL',to_date('20040202','yyyymmdd'));
commit;
--■■■Last_Value関数を使う方法■■■
select Code,Name,
(select distinct
Last_Value(b.Name2)
over(order by EndDate Rows between Unbounded Preceding and Unbounded Following) as Name2
from Bテーブル b
where b.Code=a.Code) as Name2
from Aテーブル a
order by Code;
--■■■Row_Number関数を使う方法■■■
select a.Code,a.Name,c.Name2
from Aテーブル a,
(select b.Code,b.Name2,
Row_Number() over(partition by b.Code order by b.EndDate desc) as Rank
from Bテーブル b) c
where a.Code=c.Code(+)
and c.Rank(+) = 1
order by a.Code;
--■■■相関サブクエリを使う方法■■■
select Code,Name,
(select b.Name2 from Bテーブル b
where b.Code=a.Code
and b.EndDate = (select max(c.EndDate) from Bテーブル c
where c.Code=b.Code)) as Name2
from Aテーブル a
order by Code;
Last_Value関数を使うと、ソートした最後の行の値を取得できます。