本連載は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行が作成されました。
上記の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
一度の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の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行が作成されました。
それぞれ、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行が選択されました。
EMP表からEMPNO列、ENAME列、JOB列の12行が、それぞれの表(EMP2、EMP3)に分かれてINSERTされていますね。(次ページへ続く)
Copyright © ITmedia, Inc. All Rights Reserved.