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

10-39 インラインビューとの直積演算

SQLパズル

StringTable
ColA  ColB  ColC  ColD
----  ----  ----  ----
'AL'  'AM'  'AN'  'AO'
'BL'  'BM'  'BN'  'BO'

列を行に変換して出力する。

出力結果
ColX
-----
'AL'
'AM'
'AN'
'AO'
'BL'
'BM'
'BN'
'BO'

こちらを参考にさせていただきました


データ作成スクリプト

create table StringTable(
ColA char(4),
ColB char(4),
ColC char(4),
ColD char(4));

insert into StringTable values('''AL''','''AM''','''AN''','''AO''');
insert into StringTable values('''BL''','''BM''','''BN''','''BO''');
commit;


SQL

--■■■union allを使う方法■■■
select ColA as ColX from StringTable
union all
select ColB from StringTable
union all
select ColC from StringTable
union all
select ColD from StringTable
order by 1;

--■■■インラインビューとの直積演算を使う方法■■■
select case b.No
       when 1 then a.ColA
       when 2 then a.ColB
       when 3 then a.ColC
       when 4 then a.ColD end as ColX
from StringTable a,
(select 1 as No from dual
union all select 2 from dual
union all select 3 from dual
union all select 4 from dual) b
order by ColX;

--■■■model句を使う方法(10g以降)■■■
select OutVal
  from StringTable
 model
 partition by (RowNum as Rn)
 dimension by (1 as soeji)
 measures(ColA as OutVal,ColA,ColB,ColC,ColD)
 rules(OutVal[1] = ColA[1],
       OutVal[2] = ColB[1],
       OutVal[3] = ColC[1],
       OutVal[4] = ColD[1])
order by Rn,OutVal;


解説

インラインビューとの直積演算を使う方法では、
インラインビューで4行作成し、直積演算した後、
単純case式で、出力する列を分岐させてます。