Oracleの基礎知識--高度なinsert文


scottユーザの下のemp,deptなどの数枚のテーブルを例に,sqlplusで実証した.
 
まず、空のe 1、e 2を2枚作成します.
SQL> create table e1 as select ename, sal, hiredate from emp where 1=2;

    。

SQL> create table e2 as select ename, deptno, mgr from emp where 1=2;

    。

 
oracleが表にデータを挿入するには多くの方法があります
1. insert into xxx values(xxx);
SQL> insert into e1 values('test', 2000, to_date('20111111','yyyyMMdd'));

    1  。

 
2. insert into xxx select xxx from xxx;
SQL> insert into e1 select ename, sal, hiredate from emp;

   14 。

 
3.拡張inert文:クエリー文の結果を複数のテーブルに挿入します.
    1). insert all
SQL> insert all
  2  into e1 values(ename, sal, hiredate)
  3  into e2 values(ename, deptno, mgr)
  4  select * from emp;

   28 。

クエリー結果の各ローをe 1,e 2テーブルに挿入します.select*from empは全部で14行のデータなので、28行挿入します. 
  
    2). insert first
SQL> insert first
  2  when sal > 2500 then
  3  into e1 values(ename, sal, hiredate)
  4  when sal >1000 then
  5  into e2 values(ename, deptno, mgr)
  6  select * from emp;

   12 。

クエリ結果の1行は、2つのテーブルの条件が一致していても1つのテーブルにのみ挿入できます.前に書いた条件を優先して挿入...テストを続行できます.
SQL> delete from e1;

   5 。

SQL> delete from e2;

   7 。

SQL> insert first
  2  when sal > 1000 then
  3  into e1 values(ename, sal, hiredate)
  4  when sal > 2000 then
  5  into e2 values(ename, deptno, mgr)
  6  select * from emp;

   12 。

SQL> select count(1) from e1;

  COUNT(1)
----------
        12

SQL> select count(1) from e2;

  COUNT(1)
----------
         0

 
e 2テーブルにはローが挿入されていません.2番目の条件を満たすローはすべて第1の条件を満たすため、e 1に挿入されています.だから条件を書くときに注意しなければなりません...
 
OK~終了~