關於ORACLE中插入,更新(MERGE)的使用

來源:互聯網
上載者:User

Oracle9i引入了一個新的SQL語句,使用本語句可以在一條語句中串連兩個表。
以前要使用UPDATE去更新兩個表中都存在的記錄,或者用INSERT添加兩個合并表中不存在的記錄,必須寫兩個SQL語句,
而現在這兩種操作都只要一條SQL MERGE語句就可以實現。

 

create table inventory (part_nointeger integer,part_count integer); 

insert into inventory values(1,5);

insert into inventory values(3,6); 


create table shipment (part_nointeger integer,part_count integer);

insert into shipment values(1,2);
insert into shipment values(2,2);

MERGE INTO inventory
    USING shipment
    ON (inventory.part_nointeger=shipment.part_nointeger)
WHEN MATCHED THEN
   UPDATE SET inventory.part_count=inventory.part_count+shipment.part_count  --注意如果這裡前面的part_count欄位不指明表名,預設為shipment欄位,結果會為4
WHEN NOT MATCHED THEN
   INSERT VALUES (shipment.part_nointeger,shipment.part_count);

commit;
select * from inventory;
   
truncate table inventory;     
/**//*
  PART_NO   PART_COUNT
----------              ----------
      1                      7
      3                      6
      2                      2 

 

執行的結果是shipment資料已經被合并到inventory中,所以與inventory中某些東西相匹配的shipment都會被添加到count中,
而沒有得到的匹配的就不會添加到inventory中。

 

在MERGE語句中必須指定一個WHEN MATCHED和一個WHEN NOT MATHCED語句。
如果除這兩種情況之外還有別的情況,你可能就需要使用一個常規的INSERT或者UPDATE語句。

 

另外一點是MERGE語句一次只能修改一行記錄,而且不能修改在ON子句中引用的列。

 

MERGE語句的目標表(target table)(在本例中是inventory)必須是一個可以使用INSERT語句進行插入或者UPDATE語句進行更新的表或者視圖。
源表(source table)(在本例中是shipment)可以是任何的查詢表,比如說外部表格或者管道化表函數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.