日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Merge into的使用详解-你Merge了没有

發(fā)布時間:2025/6/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Merge into的使用详解-你Merge了没有 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Merge是一個非常有用的功能,類似于Mysql里的insert into on duplicate key.?

Oracle在9i引入了merge命令,?
通過這個merge你能夠在一個SQL語句中對一個表同時執(zhí)行inserts和updates操作. 當然是update還是insert是依據(jù)于你的指定的條件判斷的,Merge into可以實現(xiàn)用B表來更新A表數(shù)據(jù),如果A表中沒有,則把B表的數(shù)據(jù)插入A表. MERGE命令從一個或多個數(shù)據(jù)源中選擇行來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的匹配關(guān)系就是on后面的條件子句的內(nèi)容,這里根據(jù)兩個表的product_id來進行匹配,那么匹配上了我們的操作是就是when matched then的子句里的動作了,這里的動作是update set p.product_name = np.product_name, 很顯然就是把newproduct里的內(nèi)容,賦值到product的product_name里。如果沒有匹配上則insert這樣的一條語句進去。 大家看看這個merget inot的用法是不是一目了然了呀。這里merger的功能,好比比較,然后選擇更新或者是插入,是一系列的組合拳,在做merge的時候,這樣同樣的情況下,merge的性能是優(yōu)于同等功能的update/insert語句的。有人曾經(jīng)分析merge是批量處理對性能貢獻很大,個人覺得這個是沒有考據(jù)的。?

我們也可以在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或者insert?
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%'?

這里注意比較一下,他們返回的結(jié)果行數(shù),是有著差異的。?

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 p.product_id = np.product_id 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 結(jié)束事務(wù)。?

Merge是一個非常強大的功能,而且是我們需求里經(jīng)常會用到的一個有用的功能,所以我們一定要好好的學習到。?

文中需要的測試腳本在附件里提供下載。?
merge into sample.sql

總結(jié)

以上是生活随笔為你收集整理的Merge into的使用详解-你Merge了没有的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。