動(dòng)機(jī): 想在Oracle中用一條SQL語句直接進(jìn)行Insert/Update的操作。 說明: 在進(jìn)行SQL語句編寫時(shí),我們經(jīng)常會(huì)遇到大量的同時(shí)進(jìn)行Insert/Update的語句 ,也就是說當(dāng)存在記錄時(shí),就更新(Update),不存在數(shù)據(jù)時(shí),就插入(Insert)。 merge into 是特有的功能,相當(dāng)于在 MSSQL中的 if exists(...) update table else Insert into table. merge into 語法不僅沒有if exists語法啰嗦,而且比if exists 還要高效很多。我經(jīng)常用來在oracle之間同步數(shù)據(jù)庫表。 語法如下: MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1, col2 = col2_val WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values); 如果不懂Merge語句的原理,Merge語句是一條比較危險(xiǎn)的語句,特別是在您只想更新一條記錄的時(shí)候,因?yàn)椴唤?jīng)意間,你可能就把整表的數(shù)據(jù)都Update了一遍.....汗!!! ORACLE 9I中加入了MERGE 語法: MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] { table | view | subquery } [t_alias] ON ( condition ) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause; 創(chuàng)建測(cè)試數(shù)據(jù)表: create table tj_test(id number,name varchar2(20),age number); 向表中插入數(shù)據(jù): insert into tj_test values (1,'jan',23); insert into tj_test values (2,'kk',22); insert into tj_test values (3,'joe',27); select * from tj_test; 查詢結(jié)果如下: 1 jan 23 2 kk 22 3 joe 27 創(chuàng)建另一新表 create table tj_test1 as select * from tj_test where 1=0 插入一條數(shù)據(jù) insert into tj_test1 values (1,'jlk',23); select * from tj_test1 查詢結(jié)果如下: 1 jkl 23 --注意,這里的的NAME字段中的值是jkl 使用MERGE,實(shí)現(xiàn)有則更新,無則插入,sql語句如下: merge into tj_test1 tt1 using tj_test tt on (tt1.id=tt.id) when matched then update set tt1.name=tt.name, tt1.age=tt.age when not matched then insert values( tt.id, tt.name, tt.age) 查詢tj_test1表(對(duì)比原來表中的數(shù)據(jù),更新了ID=1 ROW中字段NAME,同時(shí)多出兩條新數(shù)據(jù)) select * from tj_test1 改變行數(shù)據(jù)如下: 1 jan 23 --這里的原有jkl值被更新 3 joe 27 --原來表中沒有的插入 2 kk 22 --原來表中沒有的插入 如果存在就更新,不存在就插入 9i已經(jīng)支持了,是Merge,但是只支持select子查詢, 如果是單條數(shù)據(jù)記錄,可以寫作select …… from dual的子查詢。 語法為: MERGE INTO table USING data_source ON (condition) WHEN MATCHED THEN update_clause WHEN NOT MATCHED THEN insert_clause; 如: MERGE INTO course c USING (SELECT course_name, period, course_hours FROM course_updates) cu ON (c.course_name = cu.course_name AND c.period = cu.period) WHEN MATCHED THEN UPDATE SET c.course_hours = cu.course_hours WHEN NOT MATCHED THEN INSERT (c.course_name, c.period, c.course_hours) VALUES (cu.course_name, cu.period, cu.course_hours); 本人今天看到了,覺得不錯(cuò),呵呵,如有存在問題,希望能給以指導(dǎo)! |
|