爲了方便大家學習和測試,所有的例子都是在Oracle自帶用戶Scott下建立的。
MERGE是什麼?這麼厲害的東西你都不知道,你這學生是怎麼學習的?老師不給你講你就不會自學了嗎?哎!可憐天下老師心啊,罷了罷了,老師現在給你好好講一下吧。
MERGE是Oracle9i新增的語法,中文意思是“合併”,那合併什麼呢?它能合併INSERT和UPDATE在一條SQL語句中執行,是不是很牛X?!還有更牛X的,就是在執行該條語句時只做一次全表掃描,效率非常高。是不是有點心癢難耐了,哈哈,不着急,老師接下來給你具體講講它的用法。不過在講之前我們需要做兩點準備工作:
一、創建測試表且填充測試數據
- create table merge_test as select * from scott.dept
- delete from merge_test t where t.deptno=10
- update merge_test t set t.dname = 'TEST'
這個太簡單了,執行下面的兩條SQL語句不就可以了?!
- delete from merge_test
- insert into merge_test select * from scott.dept
有!有!有!先把scott.dept表中的字段dname值更新到表merge_test的字段dname。
- update merge_test m
- set dname =
- (select dname from scott.dept t where m.deptno = t.deptno)
- insert into merge_test m
- select *
- from scott.dept
- where deptno not in (select deptno from merge_test)
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname when not matched then insert values(t.deptno, t.dname, t.loc)
一些聰明的同學可能會問了,只能全表操作嗎?可不可以根據篩選條件來操作呢?這樣的同學真讓人省心,你說老師能不喜歡嗎?!針對這個問題,答案是肯定的,比如我只想更新deptno=20的部門名稱,修改後的SQL語句如下:
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname
- where (m.deptno = 20) when not matched then insert values(t.deptno, t.dname, t.loc)
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname delete
- where (m.deptno = 20) when not matched then insert values(t.deptno, t.dname, t.loc)
備註:where與delete的語法是Oracle10i新增的。