1. MERGE INTO 的用途 MERGE INTO 是Oracle 9i以後才出現的新的功能。那這個功能 是什麼呢? 簡單來說,就是:“有則更新,無則插入” 從這句話里,應該可以理解到,merge into 操作一個對象'A'的時候,要有另外一個結果集做為源數據 'B'. ‘merge int ...
1. MERGE INTO 的用途
MERGE INTO 是Oracle 9i以後才出現的新的功能。那這個功能 是什麼呢?
簡單來說,就是:“有則更新,無則插入”
從這句話里,應該可以理解到,merge into 操作一個對象'A'的時候,要有另外一個結果集做為源數據 'B'.
‘merge into’ 將B中的數據與A中的數據按照一定條件'C'進行對比,如果 A中數據滿足C條件,則進行update操作,如果不滿足條件 'C',則進行insert操作。(請註意這種對應關係)
2、 語法結構
MERGE [INTO] [schema.]table [alias]
USING {[schema.]table|views|query} [alias]
ON {condition}
WHEN MATCHED THEN UPDATE SET {clause}
WHEN NOT MATCHED THEN INSERT VALUES {clause}
可以用於單條數據的處理,也可以用於數據的批處理。對於merge into來說效率要比單獨執行update+insert 操作效率要高。
但是請註意,using語句中的結果集 B不可以與merge into 的對象A相同,否則,會因為結果集A,B恆等。
當 on() 進行等值判斷時,只可以進行update操作,不能進行insert 操作,當 on() 進行不等值判斷時,只可以進行insert操作,不能進行update操作。
可能這樣說還不是很清楚。下麵我們實際操作演示,就會理解清楚了。
3. 測試 MERGE INTO
--------------------------------------------------------------------------------------------------------------
------------------------------------- 創建測試表--TEST1 ----------------------------------
1 CREATE TABLE TEST1(
2 USERID NUMBER,
3 ID NUMBER
4 );
Table created
--------------------------------------------------------------------------------------------------------------
---------------------------------- 填充測試數據 -------------------------------
1 begin
2 for i in 100..110
3 loop
4 insert into test1 values(i,(i+100)/10);
5 end loop;
6 end;
7 /
--------------------------------------------------------------------------------------------------------------
----------------------------- 創建測試表--TEST2 、TEST3 --------------------------------
1 create table test2 as
2 select userid,trunc(id,-1) id2 from test1 where length(id)=4;
3
4 insert into test2 values('110','30');
1 create table test3
2 as
3 select userid,id id3 from test1 where length(id) <> 4;
--------------------------------------------------------------------------------------------------------------
----------------------------------- 測試MERGE INTO -----------------------------------
1 MERGE INTO test3 t
2 USING (SELECT userid,id2 FROM test2) tw
3 ON (t.userid = tw.userid)
4 WHEN MATCHED THEN UPDATE SET t.id3=tw.id2
5 WHEN NOT MATCHED THEN INSERT VALUES(tw.userid,tw.id2);
--測試完成,我們看到,test2表中的數據全部加到test3表中,而且更新了一條數據 userid=‘110’
PS:
on(condition_clause)這裡的條件句中,可以使用=,>,< 等比較運算符。
------------------------------------- The End -------------------------------------------