Oracle中的Merge Into在數據庫可以替代update/insert使用,同時具有二者功能,在數據庫中沒有對應記錄時,插入記錄;數據庫中有對應記錄時,更新記錄。
語法:
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 = col_val2 WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);
應用:
1、當數據庫中已經存在數據時,覆蓋數據庫中記錄,即完全拿最新的數據替換數據庫中已有數據。
MERGE INTO D_MESSAGE_FLOOD T1 USING (select '14' id from dual) T2 ON ( T1.id=T2.id) WHEN MATCHED THEN UPDATE set T1.dr_2='dr_2',T1.dd='dd' WHEN NOT MATCHED THEN INSERT (id) VALUES('14');
2、當數據庫中已存在數據時,向數據庫中追加記錄,即只更新此條記錄中為空的字段,不為空的字段保留
MERGE INTO D_MESSAGE_FLOOD T1 USING (select '14' id from dual) T2 ON ( T1.id=T2.id) WHEN MATCHED THEN UPDATE SET T1.dr_2 = (case when T1.dr_2 is null or T1.dr_2='' then 'dr_2' else T1.dr_2 end), T1.dd = (case when T1.dd is null or T1.dd='' then 'dd ' else T1.dd end)
WHEN NOT MATCHED THEN INSERT (id) VALUES('14');
3、當數據庫中已存在數據時,丟棄最新記錄,保留數據庫中原有記錄。這個比較簡單,當判斷條件成立時,不做處理就行了
MERGE INTO D_MESSAGE_FLOOD T1 USING (select '14' id from dual) T2 ON ( T1.id=T2.id) WHEN NOT MATCHED THEN INSERT (id) VALUES('14');