MERGE語句是Oracle9i新增的文法,用來合并UPDATE和INSERT語句。是oracle特有的功能,相當於在 MSSQL中的
if exists(...)
update table
else
Insert into table.
merge into 文法根據一張表或子查詢的串連條件對另外一張表進行查詢,串連條件匹配上的進行UPDATE,無法匹配的執行INSERT。
這個文法僅需要一次全表掃描就完成了全部工作,不僅沒有if exists文法囉嗦,而且執行效率比if exists高很多。常用來在oracle之間同步資料庫表。
文法如下:
MERGE INTO table_name a
USING (table|view|sub_query) b
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col_val1,
col2 = col2_val
DELETE WHERE (condition)
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
1、從文法條件上看( ON (join condition) ),merge into也是一個危險的文法。如果不謹慎使用,會將alias2 表全部覆蓋a,既危險又浪費效率,違背了增量同步處理的原則。我在設計表結構中,一般每條記錄都有“更新時間”的欄位,用a“最大更新時間”判斷b資料是否有更新和新增的資訊。須謹慎控制b條件。
2、更新的欄位,不允許有關聯條件的欄位(join condition)。比如條件是 A.ID=B.ID,那麼使用“SET A.ID=B.ID”將報出一個莫名其妙的提示錯誤。
3、使用merge的前題是在表alias2中每條記錄都是唯一的,否則會報出“在表alias2 中找不到一個穩定行”。
4、UPDATE子句後面可以跟DELETE子句來去除一些不需要的行;直接在update結束的後面加DELETE WHERE (condition)