マルチテーブル・インサートの実践サンプル
マルチテーブル・インサートでデータを分割し別表に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.