連載
» 2006年03月01日 00時00分 公開

SQLクリニック(12):1つのSQL文で複数の表にINSERTする絶品テクニック (2/2)

[岸本拓也, 林優,株式会社インサイトテクノロジー]
前のページへ 1|2       

マルチテーブル・インサートの実践サンプル

 マルチテーブル・インサートでデータを分割し別表に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に特化した製品開発、コンサルティングを手掛けるエンジニア集団。大道隆久は緊迫したトラブル現場でも常に冷静沈着であり、スマートに解決へと導いていくシステムコンサルタント。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。