INSERT 多表插入INSERT ALL 和INSERT FIRST

-----试验一.无条件的INSERT ALL
 insert all
  into my_emp(ename) values(object_value)
  into my_dept(dname) values(object_value)
  else
  into my_other
  select * from my_object

-----试验二.有条件的INSERT ALL

---1.登录system用户创建自己的emp,dept表,清空数据,备用

 CREATE table leon.my_emp as select * from scott.emp                    
 CREATE table leon.my_dept as select * from scott.dept
  delete  from my_emp
  SELECT *FROM my_emp
  delete  from my_dept
  SELECT *FROM my_dept
 
---2.创建插入数据源表my_object,表my_other适用于else插入用的
CREATE table my_object(
  object_type varchar2(20),
  object_value varchar2(30)
  )
 
  CREATE table my_other(
  object_type varchar2(20),
  object_value varchar2(30)
  )

---为my_object插入数据,后查询结果
SQL> select * from my_object;

OBJECT_TYPE          OBJECT_VALUE
-------------------- ------------------------------
emp                  liangcq
emp                  无名
emp                  小贩
dept                 软开
dept                 电信
dept                 电力
dept                 政府
dept                 商用
emp                  兴勇
emp                  亮仔
emp                  耗子

OBJECT_TYPE          OBJECT_VALUE
-------------------- ------------------------------
emp                  彬哥
sale                 10000
sale                 45000
other                neusoft

已选择15行。

-----有条件的INSERT ALL

insert all
  when (object_type='emp') then
  into my_emp(ename) values(object_value)
  when (object_type='dept') then
  into my_dept(dname) values(object_value)
  select * from my_object
 
---也可以加上else

 
SQL>  insert all
  2    when (object_type='emp') then
  3    into my_emp(ename) values(object_value)
  4    when (object_type='dept') then
  5    into my_dept(dname) values(object_value)
  6    else
  7    into my_other
  8    select * from my_object;

已创建15行。

SQL> select count(*) from my_emp;

  COUNT(*)
----------
         7

SQL> select count(*) from my_dept;

  COUNT(*)
----------
         5

SQL> select count(*) from my_other;

  COUNT(*)
----------
         3

SQL> select count(*) from my_object where object_type='emp';

  COUNT(*)
----------
         7

SQL> select count(*) from my_object where object_type='dept';

  COUNT(*)
----------
         5
-------------------------------------------------

-----试验三.有条件的INSERT FIRST和INSERT ALL的比较
--------------------------------------------------------------------------------------------------------
---试验思路:

----1. 创建3个测试表a_test、b_test、c_test,和插入数据来源表 data_test,并给数据来源表加入测试数据
----   测试数据用1至9,a到i来表示,直观。
----2.测试语句 : 条件 INSERT ALL,用id来作为条件,与查询比较a_test、b_test中的数据个数和数据项
----3.测试语句 : 条件 INSERT FIRST,用id来作为条件,与INSERT ALL查询比较a_test、b_test中的数据个数和数据项
--------------------------------------------------------------------------------------------------------
----1. 创建3个测试表a_test、b_test、c_test,和插入数据来源表 data_test,并给数据来源表加入测试数据
SQL> create table a_test(
  2    id number(4),
  3    name varchar2(20)
  4    );

表已创建。

SQL> create table b_test(
  2    id number(4),
  3    name varchar2(20)
  4    );

表已创建。

SQL> create table c_test(
  2    id number(4),
  3    name varchar2(20)
  4    );

表已创建。

SQL> create table data_test(
  2    id number(4),
  3    name varchar2(20)
  4    );

表已创建。

----创建测试数据后,data_test中的数据
SQL> select * from data_test;

        ID NAME
---------- --------------------
         1 a
         2 b
         3 c
         4 d
         5 e
         6 f
         7 g
         8 h
         9 i

已选择9行。

----2.测试语句 : 条件 INSERT ALL,

SQL> insert all
  2    when (id>2) then
  3    into a_test
  4    when (id<6) then
  5    into b_test
  6    else
  7    into c_test
  8    select * from data_test;

已创建12行。

SQL>   select * from c_test;

未选定行

SQL>   select * from a_test;

        ID NAME
---------- --------------------
         3 c
         4 d
         5 e
         6 f
         7 g
         8 h
         9 i

已选择7行。

SQL>   select * from b_test;

        ID NAME
---------- --------------------
         1 a
         2 b
         3 c
         4 d
         5 e
        
----3.测试语句 : 条件 INSERT FIRST,

SQL> rollback ;

回退已完成。

SQL> insert first
  2    when (id>2) then
  3    into a_test
  4    when (id<6) then
  5    into b_test
  6    else
  7    into c_test
  8    select * from data_test;

已创建9行。

SQL>   select * from a_test;

        ID NAME
---------- --------------------
         3 c
         4 d
         5 e
         6 f
         7 g
         8 h
         9 i

已选择7行。

SQL>   select * from b_test;

        ID NAME
---------- --------------------
         1 a
         2 b

SQL> select * from c_test;

未选定行

----------------------------------------------------------------------------------------------------------------------------
试验结论:对于INSERT ALL, 满足第一个条件(即id>2),将id>2的数据取出;
                   当遇到第二个条件(id<6)时,又重新将满足i<6的数据取出。
                  
           而INSERT FIRST则不是,当第一个条件(即id>2)取出数据后,
                   再次遇到第二个条件(id<6)时,是在1到2两个数上去id小于6的,
                   而不是1到9上取。
           换句话说,
           对于INSERT ALL,插入第一张表的数据,如果满足第二张表的条件,也会插入。
           而INSERT FIRST不然,满足第一条插入条件的数据是不会进行随后的判断的       

----------------------------------------------------------------------------------------------------------------------------

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21684882/viewspace-671715/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21684882/viewspace-671715/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值