トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
5-58 外部結合して、大きいほうを出力
SQLパズル
TableA TableB
No day1 No day1 Val
-- -------- -- -------- ---
A 2007/1/1 A 2007/9/9 100
B 2007/5/1 B 2007/1/1 200
C 2007/3/3 D 2007/7/7 300
TableAとTableBを、
Noを結合条件として、
左外部結合させ、
day1は、大きいほうを出力する。
出力結果
No day1 Val
-- -------- ----
A 2007/9/9 100
B 2007/5/1 200
C 2007/3/3 null
SQL
alter session set nls_date_format = 'FMYYYY/MM/DD';
with TableA as(
select 'A' as No,to_date('2007/1/1','fmyyyy/mm/dd') as day1 from dual
union select 'B',to_date('2007/5/1','fmyyyy/mm/dd') from dual
union select 'C',to_date('2007/3/3','fmyyyy/mm/dd') from dual),
TableB as(
select 'A' as No,to_date('2007/9/9','fmyyyy/mm/dd') as day1,100 as Val from dual
union select 'B',to_date('2007/1/1','fmyyyy/mm/dd'),200 from dual
union select 'D',to_date('2007/7/7','fmyyyy/mm/dd'),300 from dual)
select a.No,
case when a.day1 < b.day1
then b.day1 else a.day1 end as day1,b.Val
from TableA a,TableB b
where a.No = b.No(+)
order by No;
解説
greatest関数とLeast関数は、
引数がnullを含むと、nullを返すようです。
SQL> select Least(100,200,null,500) as test1,
2 Greatest(100,200,null,500) as test2
3 from dual;
TEST1■TEST2
-----■-----
ヌル ■ヌル
なのでcase式を使ってます。