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

3-31 指定件数と打ち切りフラグを出力

SQLパズル

Table1    Table2
Val       Val
---       ---
 10         5
 20        15
 30        25
 40        35
 50        45
 60        55

Table1と、Table2の和集合をValの降順に5レコードのみ出力する。
6レコード以上あって、5レコードに打ち切ったかを示すIsCutFlagも出力する。

出力結果
Val  IsCutFlag
---  ---------
 60          1
 55          1
 50          1
 45          1
 40          1
 35          1


データ作成スクリプト

create table Table1(Val number(2));
create table Table2(Val number(2));

insert all
into Table1 values(10)
into Table1 values(20)
into Table1 values(30)
into Table1 values(40)
into Table1 values(50)
into Table1 values(60)
into Table2 values( 5)
into Table2 values(15)
into Table2 values(25)
into Table2 values(35)
into Table2 values(45)
into Table2 values(55)
select 1 from dual;
commit;


SQL

--■■■Row_Numberを使う方法1■■■
select Val,IsCutFlag
 from (select Val,
       Row_Number() over(order by Val desc) as Rank,
       max(decode(RowNum,5+1,1,0)) over() as IsCutFlag
         from (select Val
                 from Table1
               union all
               select Val
                 from Table2))
where Rank <= 5;

--■■■Row_Numberを使う方法2■■■
select Val,IsCutFlag
  from (select Val,
        Row_Number() over(order by Val desc) as Rank,
        case when count(*) over() > 5
             then 1 else 0 end as IsCutFlag
          from (select Val
                  from Table1
                union all
                select Val
                  from Table2))
  where Rank <= 5;

--■■■インラインビューでのorder byを使う方法■■■
select Val,IsCutFlag
  from (select Val,
        RowNum as Rank,
        case when count(*) over() > 5
             then 1 else 0 end as IsCutFlag
          from (select Val
                  from Table1
                union all
                select Val
                  from Table2
                order by Val desc)
       where RowNum <= 5+1)
where Rank <= 5;


解説

Row_Numberを使う方法2が
最も可読性が高そうですね