假如一个在线电子商务系统,我们现在需要根据订单表体现的消费金额将客户简单分为大中小三类并分别插入到三张表中.
订单表 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 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/ 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>
本文出自 “力量来源于赤诚的爱!” 博客,请务必保留此出处http://stevex.blog.51cto.com/4300375/1042856
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, select
, number
, pl sql test调式
, 消费表
, select多表sql
, 客户
多表查询技巧
oracle pl sql、oracle pl sql实战、oracle pl sql攻略、精通oracle pl sql、pl sql连接oracle,以便于您获取更多的相关知识。