トップページに戻る    次の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式を使ってます。