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

10-114 順序表と結合してソート

SQLパズル

順序表テーブル
Order_NO  ID
--------  ---
       1  aaa
       2  bbb
       3  ccc

表A            表B
ID   ItemA     ID   ItemB
---  -----     ---  -----
aaa      3     aaa      1
ccc      1     bbb      2

表Aを、IDに紐づく、順序表のOrder_NOの昇順、
表Bを、IDに紐づく、順序表のOrder_NOの昇順
で出力する。

出力結果
ID   ItemA  ItemB
---  -----  -----
aaa      3   null
ccc      1   null
aaa   null      1
bbb   null      2


データ作成スクリプト

create table 順序表 as
select 1 as Order_NO,'aaa' as ID from dual
union select 2,'bbb' from dual
union select 3,'ccc' from dual;

create table 表A as
select 'aaa' as ID,3 as ItemA from dual
union select 'ccc',1 from dual;

create table 表B as
select 'bbb' as ID,2 as ItemB from dual
union select 'aaa',1 from dual;


SQL

--■■■order by句で相関サブクエリを使う方法■■■
select ID,ItemA,ItemB
from (select 1 as Seq_NO,ID,ItemA,null as ItemB
        from 表A
      union all
      select 2,ID,null,ItemB
        from 表B) a
order by Seq_NO,(select b.Order_NO from 順序表 b
                  where b.ID = a.ID);

--■■■順序表と結合させる方法■■■
select a.ID,a.ItemA,a.ItemB
from (select 1 as Seq_NO,ID,ItemA,null as ItemB
        from 表A
      union all
      select 2,ID,null,ItemB
        from 表B) a,順序表 b
where a.ID = b.ID
order by a.Seq_NO,b.Order_NO;


解説

インラインビューに、Seq_NOという列を追加して
どっちの表から取得したかを持たせてます。