--構造環境
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 時 ...