MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)

郡麟天下發表於2013-12-04

MERGE語句是Oracle9i新增的語法,用來合併UPDATE和INSERT語句。
通過MERGE語句,根據一張表或子查詢的連線條件對另外一張表進行查詢,連線條件匹配上的進行UPDATE,無法匹配的執行INSERT。這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高於INSERT+UPDATE。 
語法為
 *************************************************************
        MERGE [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
**************************************************************
Oracle 10g中MERGE有如下一些改進:
1、UPDATE或INSERT子句是可選的
2、UPDATE和INSERT子句可以加WHERE子句
3、ON條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的

這裡說一下我自己的理解:
第一點意思是可以在MERGE INTO語法中只寫WHEN MATCHED THEN或者只寫WHEN NOT MATCHED THEN。這裡不再贅述。
第二點意思是我們可以在THEN後的UPDATE或者INSERT語句後面加上WHERE條件,比如有這樣的需求:當A表中的ID在B表中不存在時進行插入。當存在時,A表的NAME不為空時進行更新。這種情況就需要在UPDATE字句後+WHERE條件。
第三點意思是我們可以在ON條件中不進行目標表和USING表的關聯,可以在ON條件中寫如1=1這樣的條件。比如我們有這樣的需求:當isAllAdd引數為false時,進行正常的MERGE INTO。當isAllAdd引數為true時,全部執行插入。我們就可以使用這個新特性,對ON中的條件進行篩選從而達到一條sql即可滿足業務的目的。
第四點意思是我們不止可以在MERGE INTO中進行插入更新,還可以對匹配的資料進行刪除操作。這個點非常重要,個人認為第四點是這次改進中最需要我們學習的一點。比如我們有這樣的需求:A表中有期中學生ID,考試年份、考試成績、期末考試成績四個欄位。我們給期末考試成績做批量刪除功能,當沒有期中考試成績時,刪除該資料。當有期中考試成績時,將期末考試成績置空。傳統寫法將需要刪除的人員的List中的資訊其資料庫進行查詢,看其中的每一條是執行修改還是刪除,在分別呼叫。我們現在只需要
MERGE INTO A
USING (TABLE EMPLOYEE) B
ON (A.EMPLOYEEID = B.EMPLOYEEID AND A.YEAR = B.YEAR)
WHEN MATCHED THEN
UPDATE SET 期中考試成績 = ""
DELETE WHERE 期末考試成績 IS NULL

特別說明:
DELETE字句只能寫在MATCHED情況中,不匹配時無法刪除會報錯。
當DELETE跟在UPDATE字句之後時,DELETE字句是針對UPDATE字句修改後的資料進行過濾的。比如需要刪除所有C欄位="1"的資料,UPDATE字句將所有資料的C欄位都更新為1,那麼會刪除所有資料,而不是原本為1的資料。

相關文章