検索
連載

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

PC用表示
Share
Tweet
LINE
Hatena

本連載はSQLの応用力を身に付けたいエンジニア向けに、さまざまなテクニックを紹介する。SQLの基本構文は平易なものだが、実務で活用するには教科書的な記述を理解するだけでは不十分だ。本連載は、著名なメールマガジン「おら!オラ! Oracle - どっぷり検証生活」を発行するインサイトテクノロジーのコンサルタントを執筆陣に迎え、SQLのセンス向上に役立つ大技小技を紹介していく。(編集局)

 FOR...LOOP文を使って、いくつものSQL文でデータをINSERTしているPL/SQLプロシージャやプログラムをよく見掛けますが、実は1度にデータをINSERTする方法もあるんです。マルチテーブル・インサート(Multitable Insert)とはその名のとおり、1つのSQL文で複数の表にINSERTが可能になります。この最大のメリットは、やはりパフォーマンスです。では早速ご紹介します。

マルチテーブル・インサートの基本型

 ここでは、VALUES句を使って値を指定します。

SQL> insert all
  2    into sample_table (id, name, value) values (1, 'TKISHIMO', 0)
  3    into sample_table2 (id, name, value) values (2, 'MHAYASHI', 0)
  4  select * from dual;
2行が作成されました。
リスト1 VALUES句で値を指定するマルチテーブル・インサート

 上記のSQL文を実行後、sample_tableとsample_table2をSELECTしてみると……。

SQL> select * from sample_table;
        ID NAME                      VALUE
---------- -------------------- ----------
         1 TKISHIMO                      0
SQL> select * from sample_table2;
        ID NAME                      VALUE
---------- -------------------- ----------
         2 MHAYASHI                      0
リスト2 リスト1の結果を確認

 一度のSQL文でsample_tableとsample_table2にデータがINSERTされました。これを使えば、Parse処理も1回で済みますし、SQL文も1つで済むので、パフォーマンスにもいい影響を与えますよね。

 では、次に副問い合わせする表の内容を分割して、異なる表にINSERTする方法をご紹介します。

バラバラの内容を別表にINSERTする

SQL> create table emp2 as
  2  select * from emp where 1 = 0;
表が作成されました。
SQL> select * from emp2;
レコードが選択されませんでした。
SQL> create table emp3 as
  2  select * from emp where 1 = 0;
表が作成されました。
SQL> select * from emp3;
レコードが選択されませんでした。
リスト3 EMP表の枠だけコピーして2つの表(EMP2、EMP3)を作成

 リスト3のSQL文でEMP表の枠だけコピーして、EMP2とEMP3を作成します。そこへ、リスト4のSQL文を実行します。

SQL> insert all
  2     into emp2(empno, ename) values (empno, ename)
  3     into emp3(empno, job) values (empno, job)
  4  select * from emp;
24行が作成されました。
リスト4 EMP表の異なる列をEMP2、EMP3にINSERT

 それぞれ、EMP2とEMP3にINSERTされたデータは以下のとおりです。

SQL> select * from emp2;
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       
COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ------
---- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7839 KING
      7844 TURNER
      7900 JAMES
      7902 FORD
      7934 MILLER
12行が選択されました。
SQL> select * from emp3;
     EMPNO ENAME      JOB              MGR HIREDATE        SAL       
COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ------
---- ----------
      7369            CLERK
      7499            SALESMAN
      7521            SALESMAN
      7566            MANAGER
      7654            SALESMAN
      7698            MANAGER
      7782            MANAGER
      7839            PRESIDENT
      7844            SALESMAN
      7900            CLERK
      7902            ANALYST
      7934            CLERK
12行が選択されました。
リスト5 リスト4の結果を確認

 EMP表からEMPNO列、ENAME列、JOB列の12行が、それぞれの表(EMP2、EMP3)に分かれてINSERTされていますね。(次ページへ続く)

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る