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

8-52 ピボット選択インサート

SQLパズル

InsData
ID  Val1  Val2  Val3
--  ----  ----  ----
 1  AAAA  BBBB  CCCC
 2  DDDD  EEEE  null
 3  FFFF  null  null

InsDataのデータをunpivotした結果セットを
ins1とins2にinsertする。

ins1には、inClude nullsなunpivot の結果をinsertし、
ins2には、exClude nullsなunpivot の結果をinsertする。

追加結果
ins1        ins2
ID  Val     ID  Val
--  ----    --  ----
 1  AAAA     1  AAAA
 1  BBBB     1  BBBB
 1  CCCC     1  CCCC
 2  DDDD     2  DDDD
 2  EEEE     2  EEEE
 2  null     3  FFFF
 3  FFFF
 3  null
 3  null

Oracle SQLクイズの111ページを参考にさせていただきました


データ作成スクリプト

create table ins1(
ID  number,
Val char(4));

create table ins2(
ID  number,
Val char(4));

create table InsData(ID,Val1,Val2,Val3) as
select 1,'AAAA','BBBB','CCCC' from dual union
select 2,'DDDD','EEEE',null   from dual union
select 3,'FFFF',null  ,null   from dual;


SQL

--■■■inClude nullsなunpivotライクなマルチテーブルインサート■■■
insert all
into ins1 values(ID,Val1)
into ins1 values(ID,Val2)
into ins1 values(ID,Val3)
select ID,Val1,Val2,Val3 from InsData;

--■■■exClude nullsなunpivotライクなマルチテーブルインサート■■■
insert all
when Val1 is not null then into ins2 values(ID,Val1)
when Val2 is not null then into ins2 values(ID,Val2)
when Val3 is not null then into ins2 values(ID,Val3)
select ID,Val1,Val2,Val3 from InsData;


解説

データ移行で使えるかもしれませんねぇ

2-1-1 マルチテーブルインサート
10-265 差集合をマルチテーブルインサート