Oracle之merge妙用,兩值相互交叉更新

2021-08-09 23:34:05 字數 1814 閱讀 6168

--構造環境

drop table t1;

create table t1 (name varchar2(20),money number);

insert into t1 values ('a',10);

insert into t1 values ('b',20);

drop table t2;

create table t2 (name varchar2(20),money number);

insert into t2 values ('a',30);

insert into t2 values ('c',20);

commit;

--需求是,從t1表更新資料到t2表中,如果t2表的name 在t1表中已存在,就將money累加,如果不存在,將t1表的記錄插入到t2表中。

merge into t2

using t1

on (t1.name=t2.name)

when matched then

update

set t2.money=t1.money+t2.money

when not matched then

insert

values (t1.name,t1.money);

---merge 四大靈活之處

---1.update和insert動作可只出現其一(9i必須同時出現!)

我們可選擇僅僅update目標表

merge into t2

using t1

on (t1.name=t2.name)

when matched then

update

set t2.money=t1.money+t2.money;

--也可選擇僅僅insert目標表而不做任何update動作

merge into t2

using t1

on (t1.name=t2.name)

when not matched then

insert

values (t1.name,t1.money);

---2.可對merge語句加條件

merge into t2

using t1

on (t1.name=t2.name)

when matched then

update

set t2.money=t1.money+t2.money

where t1.name='a';

---3.可用delete子句清除行

/*在這種情況下,首先是要先滿足t1.name=t2.name的記錄,如果t2.name=』a』並不滿足t1.name=t2.name過濾出的記錄集,

那這個delete是不會生效的,在滿足的條件下,可以刪除目標表的記錄。

*/merge into t2

using t1

on (t1.name=t2.name)

when matched then

update

set t2.money=t1.money+t2.money

delete where (t2.name = 'a');

---4.可採用無條件方式insert

/*方法很簡單,在語法on關鍵字處寫上恆不等條件(如1=2)後,matched語句的insert就變為無條件insert了,具體如下

*/merge into t2

using t1

on (1=2)

when not matched then

insert

values (t1.name,t1.money);

oracle中merge的神奇

merge into tb1 a using select b.id,c.price from tb2 b left join tb3 c where b.id c.id d 這裡using 可以子查詢 on a.id d.id when matched then udpdate a.price b...

Oracle高階應用之合併MERGE

為了方便大家學習和測試,所有的例子都是在oracle自帶使用者scott下建立的。merge是什麼?這麼厲害的東西你都不知道,你這學生是怎麼學習的?老師不給你講你就不會自學了嗎?哎!可憐天下老師心啊,罷了罷了,老師現在給你好好講一下吧。merge是oracle9i新增的語法,中文意思是 合併 那合併...

Oracle中Merge語句效率問題

大家一定都會遇到過資料庫操作中的 update,也一定會考慮過主鍵重複的問題,簡單的解決方法就是先 select 然後根據返回值判斷是 insert 還是 update.因為公司要求這個用乙個語句執行,所以調查了 oracle 自身的 merge 語句,針對效率就調查的結果如下 操作次數為 1 時 ...