106 oracle merge

Oracle在9i引入了merge命令,

通過(guò)這個(gè)merge你能夠在一個(gè)SQL語(yǔ)句中對(duì)一個(gè)表同時(shí)執(zhí)行inserts和updates操作. 當(dāng)然是update還是insert是依據(jù)于你的指定的條件判斷的,Merge into可以實(shí)現(xiàn)用B表來(lái)更新A表數(shù)據(jù)喧枷,如果A表中沒(méi)有惦银,則把B表的數(shù)據(jù)插入A表. MERGE命令從一個(gè)或多個(gè)數(shù)據(jù)源中選擇行來(lái)updating或inserting到一個(gè)或多個(gè)表

語(yǔ)法如下

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 ! ]

我們先看看一個(gè)簡(jiǎn)單的例子懈词,來(lái)介紹一個(gè)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)

在這個(gè)例子里蜻势。前面的merger into products using newproducts 表示的用newproducts表來(lái)merge到products表读恃,merge的匹配關(guān)系就是on后面的條件子句的內(nèi)容愕鼓,這里根據(jù)兩個(gè)表的product_id來(lái)進(jìn)行匹配雷滚,那么匹配上了我們的操作是就是when matched then的子句里的動(dòng)作了需曾,這里的動(dòng)作是update set p.product_name = np.product_name, 很顯然就是把newproduct里的內(nèi)容,賦值到product的product_name里祈远。如果沒(méi)有匹配上則insert這樣的一條語(yǔ)句進(jìn)去呆万。 大家看看這個(gè)merget inot的用法是不是一目了然了呀。這里merger的功能绊含,好比比較桑嘶,然后選擇更新或者是插入,是一系列的組合拳躬充,在做merge的時(shí)候逃顶,這樣同樣的情況下,merge的性能是優(yōu)于同等功能的update/insert語(yǔ)句的充甚。有人曾經(jīng)分析merge是批量處理對(duì)性能貢獻(xiàn)很大以政,個(gè)人覺(jué)得這個(gè)是沒(méi)有考據(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有如下一些改進(jìn):

1、UPDATE或INSERT子句是可選的

2技矮、UPDATE和INSERT子句可以加WHERE子句

3抖誉、在ON條件中使用常量過(guò)濾謂詞來(lái)insert所有的行到目標(biāo)表中,不需要連接源表和目標(biāo)表

4、UPDATE子句后面可以跟DELETE子句來(lái)去除一些不需要的行

我們通過(guò)實(shí)例來(lái)一一看看如上的新特性

1. UPDATE或INSERT子句是可選的

在9i里由于必須insert into和update都要存在衰倦,也就是不是update就是insert袒炉,不支持單一的操作,雖然還是可以曲線救國(guó)樊零,呵呵 但是有些過(guò)于強(qiáng)勢(shì)了我磁。而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子句

這也是一個(gè)功能性的改進(jìn),能夠符合我們更多的需求郁副,這個(gè)where的作用很明顯是一個(gè)過(guò)濾的條件减牺,是我們加入一些額外的條件,對(duì)只對(duì)滿足where條件的進(jìn)行更新和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%'

這里表示只是對(duì)product_name開頭是'OL'的匹配上的進(jìn)行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條件中使用常量過(guò)濾謂詞來(lái)insert所有的行到目標(biāo)表中,不需要連接源表和目標(biāo)表

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)

個(gè)人覺(jué)得這個(gè)功能沒(méi)有太大的意義,我們的insert into本身就支持這樣的功能固以,沒(méi)有必要使用merge

4. UPDATE子句后面可以跟DELETE子句來(lái)去除一些不需要的行

delete只能和update配合墩虹,從而達(dá)到刪除滿足where條件的子句的紀(jì)錄

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)

這里我們達(dá)到的目的就是 會(huì)把匹配的記錄的prodcut_name更新到product里,并且把product_name開頭為OL的刪除掉憨琳。

merge into也是一個(gè)dml語(yǔ)句诫钓,和其他的dml語(yǔ)句一樣需要通過(guò)rollback和commit 結(jié)束事務(wù)。

Merge是一個(gè)非常強(qiáng)大的功能篙螟,而且是我們需求里經(jīng)常會(huì)用到的一個(gè)有用的功能菌湃,所以我們一定要好好的學(xué)習(xí)到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遍略,一起剝皮案震驚了整個(gè)濱河市惧所,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绪杏,老刑警劉巖下愈,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蕾久,居然都是意外死亡势似,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門僧著,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)履因,“玉大人,你說(shuō)我怎么就攤上這事盹愚≌て” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵杯拐,是天一觀的道長(zhǎng)霞篡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)端逼,這世上最難降的妖魔是什么朗兵? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮顶滩,結(jié)果婚禮上余掖,老公的妹妹穿的比我還像新娘。我一直安慰自己礁鲁,他們只是感情好盐欺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仅醇,像睡著了一般冗美。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上析二,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天粉洼,我揣著相機(jī)與錄音,去河邊找鬼叶摄。 笑死属韧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛤吓。 我是一名探鬼主播宵喂,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼会傲!你這毒婦竟也來(lái)了锅棕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淌山,失蹤者是張志新(化名)和其女友劉穎哲戚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艾岂,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顺少,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了王浴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脆炎。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氓辣,靈堂內(nèi)的尸體忽然破棺而出秒裕,到底是詐尸還是另有隱情,我是刑警寧澤钞啸,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布几蜻,位于F島的核電站喇潘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梭稚。R本人自食惡果不足惜颖低,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弧烤。 院中可真熱鬧忱屑,春花似錦、人聲如沸暇昂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)急波。三九已至从铲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澄暮,已是汗流浹背食店。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏寇,地道東北人吉嫩。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嗅定,于是被迫代替她去往敵國(guó)和親自娩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361