merge語法是根據源表對目標表進行匹配查詢,匹配成功時更新,不成功時插入。測試
其基本語法規則是索引
merge into 目標表 ait
using 源表 bio
on(a.條件字段1=b.條件字段1 and a.條件字段2=b.條件字段2 ……) test
when matched then update set a.更新字段=b.字段效率
when not macthed then insert into a(字段1,字段2……)values(值1,值2……)date
變種寫法①,只更新:語法
merge into 目標表 a查詢
using 源表 btab
on(a.條件字段1=b.條件字段1 and a.條件字段2=b.條件字段2 ……)
when matched then update set a.更新字段=b.字段,a.更新字段2=b.字段2……
變種寫法②,只插入:
merge into 目標表 a
using 源表 b
on(a.條件字段1=b.條件字段1 and a.條件字段2=b.條件字段2 ……)
when not macthed then insert into a(字段1,字段2……)values(值1,值2……)
注:條件字段不可更新
對於Oracle來講,merge是9i新增的語法,在10g進行了一些加強,以下:
測試環境:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
①條件操做:
merge into 目標表 a
using 源表 b
on(a.條件字段1=b.條件字段1 and a.條件字段2=b.條件字段2 ……)
when matched then update set a.更新字段=b.字段 where 限制條件
when not macthed then insert into a(字段1,字段2……)values(值1,值2……) where 限制條件
舉例:
merge into test_merge a
using test b
on(a.no=b.no)
when matched then update set a.no2=b.no2 where a.no<>1
when not matched then insert values(b.no,b.no2) where a.no<>100
固然也支持變種①②的寫法
②刪除操做
merge into 目標表 a
using 源表 b
on(a.條件字段1=b.條件字段1 and a.條件字段2=b.條件字段2 ……)
when matched then update set a.更新字段=b.字段
delete where b.字段=xxx
舉例:
merge into test_merge a
using test b
on(a.no=b.no)
when matched then update set a.no2=b.no2 where a.no<>1
delete
where b.no=14
備註:刪除動做針對的也是目標表,而且必須在語句最後
基本上merge的用法就是以上這些,建議日常能夠多用,比單獨的update+insert的方式效率要更高,尤爲是on條件下有惟一索引的時候,效率更高