マルチテーブル・インサートの実践サンプル
マルチテーブル・インサートでデータを分割し別表にINSERTする方法を使って、実践的なサンプルを作成しました。SCORE表には、学籍番号、英語、国語、数学、理科、社会の5教科の点数が存在します。
SQL> select * from score;
NO EIGO KOKUGO SUGAKU RIKA SYAKAI
---------- ---------- ---------- ---------- ---------- ----------
1 98 67 76 70 82
2 90 77 86 40 62
3 30 100 76 52 92
4 64 57 65 97 66
5 87 56 100 76 45
リスト6 SCORE表のデータ
この表を基に、科目別の集計テーブルを作成します。
SQL> insert all
2 into score_eigo values( no, eigo )
3 into score_kokugo values( no, kokugo )
4 into score_sugaku values( no, sugaku )
5 into score_rika values( no, rika )
6 into score_syakai values( no, syakai )
7 select
8 no,eigo,kokugo,sugaku,rika,syakai
9 from
10 score;
25行が作成されました。
SQL> select * from score_eigo;
NO SCORE
---------- ----------
1 98
2 90
3 30
4 64
5 87
リスト7 科目別の集計テーブルを作成
このようにマルチテーブル・インサートを使うと、1つの科目だけ別表にINSERTすることが可能です。
条件に合致したらすべての表にInsertする
でも、このようなマルチテーブル・インサートの場合、条件式を付けたい場合もよくあります。そんなときは、MERGE文でも使ったWHEN句を使います。
SQL> insert all 2 when eigo <= 60 then 3 into score_eigo values( no, eigo ) 4 when kokugo <= 60 then 5 into score_kokugo values( no, kokugo ) 6 when sugaku <= 60 then 7 into score_sugaku values( no, sugaku ) 8 when rika <= 60 then 9 into score_rika values( no, rika ) 10 when syakai <= 60 then 11 into score_syakai values( no, syakai ) 12 select 13 no,eigo,kokugo,sugaku,rika,syakai 14 from 15 score; 6行が作成されました。
リスト8 条件式を付けたマルチテーブル・インサート
これで各科目の60点以下のデータは、それぞれの表にINSERTされているはずです。
SQL> select * from score_eigo;
NO SCORE
---------- ----------
3 30
リスト9 リスト8の結果を確認
英語では、「NO=3」の30点のデータがINSERTされているだけですね。
バラバラの内容を別表にInsert(条件付き)
今度はSCORE表の中から、60点以下のデータをtsuishi_student表にINSERTします。
SQL> insert first
2 when eigo <= 60 then
3 into tsuishi_student values (no, '英語', eigo )
4 when kokugo <= 60 then
5 into tsuishi_student values (no, '国語', kokugo )
6 when sugaku <= 60 then
7 into tsuishi_student values (no, '数学', sugaku )
8 when rika <= 60 then
9 into tsuishi_student values (no, '理科', rika )
10 when syakai <= 60 then
11 into tsuishi_student values (no, '社会', syakai )
12 select
13 no,eigo,kokugo,sugaku,rika,syakai
14 from
15 score;
4行が作成されました。
SQL> select * from tsuishi_student;
NO SUBJECT POINT
---------- ---------- ----------
3 英語 30
4 国語 57
5 国語 56
2 理科 40
リスト10 SCORE表から60点以下のデータを別表にINSERT
このように、別表から条件付きで抽出することも可能です。工夫次第では、時間がかかっていたバッチ処理のパフォーマンスアップにつながるかもしれません。ぜひぜひ検討してみてください。
さて、今回でSQLクリニックは最終回となりますが、インサイトテクノロジーのメルマガでも入門者用メルマガを始めようか? という案も浮上しています。ぜひとも期待していてください。(連載完)
筆者紹介
Oracleに特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。
Copyright © ITmedia, Inc. All Rights Reserved.