Oracle SQL、PLSQL 絕技之多表插入

來源:互聯網
上載者:User

假如一個線上電子商務系統,我們現在需要根據訂單表體現的消費金額將客戶簡單分為大中小三類並分別插入到三張表中.

訂單表 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實現的例子,是不是一目瞭然?
 
  1. 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;  
  
 
  1. FIRST:表示第一WHEN條件符合後就跳到下條記錄,不再判斷其它WHEN條件。 
  2. ALL  :表示不管前面的WHEN條件是否已經滿足,後續的條件都會被判斷,可能會一次出現多表同時插入。 
  樣本完整代碼: 
 
  1. SQL> create table order_test (order_id number, cust_id number, amount number); 
  2.   
  3. Table created 
  4.   
  5. SQL> create table small_cust_test (cust_id number, tot_amt number); 
  6.   
  7. Table created 
  8.   
  9. SQL> create table med_cust_test (cust_id number, tot_amt number); 
  10.   
  11. Table created 
  12.   
  13. SQL> create table big_cust_test (cust_id number, tot_amt number); 
  14.   
  15. Table created 
  16.   
  17. SQL> select * from order_test order by order_id; 
  18.   
  19.   ORDER_ID    CUST_ID     AMOUNT 
  20. ---------- ---------- ---------- 
  21.          1       1001       2060 
  22.          2       1002      20060 
  23.          3       1003      30060 
  24.          4       1004      50060 
  25.          5       1004      10060 
  26.          6       1005     100060 
  27.          7       1001       2000 
  28.          8       1001       2050 
  29.   
  30. 8 rows selected 
  31.   
  32. SQL> select cust_id, sum(amount) as tot_amt from order_test group by cust_id; 
  33.   
  34.    CUST_ID    TOT_AMT 
  35. ---------- ---------- 
  36.       1003      30060 
  37.       1001       6110 
  38.       1002      20060 
  39.       1004      60120 
  40.       1005     100060 
  41.   
  42. SQL> select * from small_cust_test; 
  43.   
  44.    CUST_ID    TOT_AMT 
  45. ---------- ---------- 
  46.   
  47. SQL> select * from med_cust_test; 
  48.   
  49.    CUST_ID    TOT_AMT 
  50. ---------- ---------- 
  51.   
  52. SQL> select * from big_cust_test; 
  53.   
  54.    CUST_ID    TOT_AMT 
  55. ---------- ---------- 
  56.   
  57. SQL> insert first 
  58.   2  when tot_amount < 10000 then 
  59.   3  into small_cust_test 
  60.   4  when tot_amount >=10000 and tot_amount <50000 then 
  61.   5  into med_cust_test 
  62.   6  else 
  63.   7  into big_cust_test 
  64.   8  select cust_id,sum(amount) as tot_amount  
  65.   9  from order_test 
  66.  10  group by cust_id; 
  67.   
  68. 5 rows inserted 
  69.   
  70. SQL> select * from small_cust_test; 
  71.   
  72.    CUST_ID    TOT_AMT 
  73. ---------- ---------- 
  74.       1001       6110 
  75.   
  76. SQL> select * from med_cust_test; 
  77.   
  78.    CUST_ID    TOT_AMT 
  79. ---------- ---------- 
  80.       1003      30060 
  81.       1002      20060 
  82.   
  83. SQL> select * from big_cust_test; 
  84.   
  85.    CUST_ID    TOT_AMT 
  86. ---------- ---------- 
  87.       1004      60120 
  88.       1005     100060 
  89.   
  90. SQL>  

本文出自 “力量來源於赤誠的愛!” 部落格,請務必保留此出處http://stevex.blog.51cto.com/4300375/1042856

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.