oracle中merge into的使用

來源:互聯網
上載者:User

標籤:其他   nal   賦值   關係   -name   blog   開頭   存在   執行個體   

Oracle在9i引入了merge命令, 
通過這個merge你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. 當然是update還是insert是依據於你的指定的條件判斷的,Merge into可以實現用B表來更新A表資料,如果A表中沒有,則把B表的資料插入A表. MERGE命令從一個或多個資料來源中選擇行來updating或inserting到一個或多個表 

文法如下 
MERGE INTO [your table-name] [rename your table here] 
USING ( [write your query here] )[rename your query-sql and using just like a table] 
ON ([conditional expression here] AND [...]...) 
WHEN MATHED THEN [here you can execute some update sql or something else ] 
WHEN NOT MATHED THEN [execute something else here ! ] 

我們先看看一個簡單的例子,來介紹一個merge into的用法 
merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 

在這個例子裡。前面的merger into products using newproducts 表示的用newproducts表來merge到products表,merge的匹配關係就是on後面的條件子句的內容,這雷根據兩個表的product_id來進行匹配,那麼匹配上了我們的操作是就是when matched then的子句裡的動作了,這裡的動作是update set p.product_name = np.product_name, 很顯然就是把newproduct裡的內容,賦值到product的product_name裡。如果沒有匹配上則insert這樣的一條語句進去。 大家看看這個merget inot的用法是不是一目瞭然了呀。這裡merger的功能,好比比較,然後選擇更新或者是插入,是一系列的組合拳,在做merge的時候,這樣同樣的情況下,merge的效能是優於同等功能的update/insert語句的。

我們也可以在using後面使用視圖或者子查詢。比如我們把newproducts換成 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
也是可以的。 

在Oracle 10g中MERGE有如下一些改進: 
1、UPDATE或INSERT子句是可選的 
2、UPDATE和INSERT子句可以加WHERE子句 
3、在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要串連源表和目標表 
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的行 

我們通過執行個體來一一看看如上的新特性 

1. UPDATE或INSERT子句是可選的 
在9i裡由於必須insert into和update都要存在,也就是不是update就是insert,不支援單一的操作,不能靈活變通。而10g裡就是可選了,能符合我們更多的需求了 
比如上面的句子 
我們可以只存在update
merge into products p using newproducts np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name 
這裡,如果匹配就更新,不存在就不管了。 

2. UPDATE和INSERT子句可以加WHERE子句 
這也是一個功能性的改進,能夠符合我們更多的需求,這個where的作用很明顯是一個過濾的條件,是我們加入一些額外的條件,對只對滿足where條件的進行更新和insert 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name where np.product_name like ‘OL%‘ 
這裡表示只是對product_name開頭是‘OL‘的匹配上的進行update,如果開頭不是‘OL‘的就是匹配了也不做什麼事情,insert裡也可以加入where 
比如 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name where np.product_name like ‘OL%‘ 
when not matched then 
insert values(np.product_id, np.product_name, np.category) where np.product_name like ‘OL%‘ 

3. 在ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要串連源表和目標表 

merge into products p using (select * from newproducts) np on (1=0) 
when matched then 
update set p.product_name = np.product_name 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
個人覺得這個功能沒有太大的意義,我們的insert into本身就支援這樣的功能,沒有必要使用merge 

4. UPDATE子句後面可以跟DELETE子句來去除一些不需要的行 
delete只能和update配合,從而達到刪除滿足where條件的子句的紀錄 
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
when matched then 
update set p.product_name = np.product_name delete where np.product_name like ‘OL%‘ 
when not matched then 
insert values(np.product_id, np.product_name, np.category) 
這裡我們達到的目的就是 會把匹配的記錄的prodcut_name更新到product裡,並且把product_name開頭為OL的刪除掉。

merge into也是一個dml語句,和其他的dml語句一樣需要通過rollback和commit 結束事務。 

Merge是一個非常強大的功能,而且是我們需求裡經常會用到的一個功能。

oracle中merge into的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.