为了账号安全,请及时绑定邮箱和手机立即绑定

Oracle SQL、PLSQL 绝技之多表插入

标签:
Oracle


假如一个在线电子商务系统,我们现在需要根据订单表体现的消费金额将客户简单分为大中小三类并分别插入到三张表中.

订单表 order (order_id number, cust_id number, amount number);

小客户表 small_cust (cust_id number, tot_amt number);

中客户表 med_cust (cust_id number, tot_amt number);

大客户表 big_cust (cust_id number, tot_amt number);

 

如果总消费金额小于10000, 则归入小客户;

如果总消费金额大于10000并小于50000,则归入中客户;

如果总消费金额大于50000,则归入大客户;

 

要实现这个需求,如果我们不知道INSERT ALL/FIRST 的用法,可能会用一段PL/SQL遍历查询订单表返回的游标,然后逐条记录判断客户消费总额来决定插入哪个表,需要分别写三个INSERT语句,这样也可以达到目的,但远没有使用INSERT FIRST简洁和高效。

 

下面是用INSERT FIRST实现的例子,是不是一目了然?

 insert first  

    when tot_amount < 10000 then  

    into small_cust_test  

    when tot_amount >=10000 and tot_amount <50000 then  

    into med_cust_test  

    else  

    into big_cust_test  

    select cust_id,sum(amount) as tot_amount   

    from order_test  

    group by cust_id;  

 

 

FIRST:表示第一WHEN条件符合后就跳到下条记录,不再判断其它WHEN条件。 

ALL  :表示不管前面的WHEN条件是否已经满足,后续的条件都会被判断,可能会一次出现多表同时插入。 

 

示例完整代码: 

SQL> create table order_test (order_id number, cust_id number, amount number); 

  

Table created 

  

SQL> create table small_cust_test (cust_id number, tot_amt number); 

  

Table created 

  

SQL> create table med_cust_test (cust_id number, tot_amt number); 

  

Table created 

  

SQL> create table big_cust_test (cust_id number, tot_amt number); 

  

Table created 

  

SQL> select * from order_test order by order_id; 

  

  ORDER_ID    CUST_ID     AMOUNT 

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

         1       1001       2060 

         2       1002      20060 

         3       1003      30060 

         4       1004      50060 

         5       1004      10060 

         6       1005     100060 

         7       1001       2000 

         8       1001       2050 

  

8 rows selected 

  

SQL> select cust_id, sum(amount) as tot_amt from order_test group by cust_id; 

  

   CUST_ID    TOT_AMT 

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

      1003      30060 

      1001       6110 

      1002      20060 

      1004      60120 

      1005     100060 

  

SQL> select * from small_cust_test; 

  

   CUST_ID    TOT_AMT 

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

  

SQL> select * from med_cust_test; 

  

   CUST_ID    TOT_AMT 

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

  

SQL> select * from big_cust_test; 

  

   CUST_ID    TOT_AMT 

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

  

SQL> insert first 

  2  when tot_amount < 10000 then 

  3  into small_cust_test 

  4  when tot_amount >=10000 and tot_amount <50000 then 

  5  into med_cust_test 

  6  else 

  7  into big_cust_test 

  8  select cust_id,sum(amount) as tot_amount  

  9  from order_test 

 10  group by cust_id; 

  

5 rows inserted 

  

SQL> select * from small_cust_test; 

  

   CUST_ID    TOT_AMT 

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

      1001       6110 

  

SQL> select * from med_cust_test; 

  

   CUST_ID    TOT_AMT 

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

      1003      30060 

      1002      20060 

  

SQL> select * from big_cust_test; 

  

   CUST_ID    TOT_AMT 

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

      1004      60120 

      1005     100060 

  

SQL>  

©著作权归作者所有:来自51CTO博客作者sarchitect的原创作品,如需转载,请注明出处,否则将追究法律责任

ORACLEINSERT ALL/FIRST多表插入ORACLE


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消