前言
MERGE語句是Oracle9i新增的語法,用來合并UPDATE和INSERT語句。 通過MERGE語句,根據一張表或多表聯合查詢的連接條件對另外一張表進行查詢,連接條件匹配上的進行UPDATE,無法匹配的執行INSERT。這個語法僅需要一次全表掃描就完成了全部工作,執行效率要高于INSERT+UPDATE。通過這個MERGE你能夠在一個SQL語句中對一個表同時執行INSERT和UPDATE操作.
本博客介紹一下Oracle merge合并函數,業務場景:新增數據的時候要先查詢數據庫是否已經有改數據,有數據就更新數據,沒數據才新增數據,這是很常見的業務場景,如果是用Oracle數據庫的話,其實直接用merge函數效率更快,而且merge函數性能也相對比較好
merge函數的語法:
1
2
3
4
5
6
7
8
9
|
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); |
舉個例子:
SQL實現,意思是有數據就更新,沒數據才新增
1
2
3
4
5
6
7
8
9
10
11
12
13
|
MERGE INTO t_config_related A1 USING( select '97547758-6f85-419e-85f9-b8f711ca2660' seq, '97547758-6f85-419e-85f9-b8f711ca2658' tipsSeq, to_number( '1' ) appLevel, '24e1ccc38d9542189d1cc6c23f814a18' relaSeq from dual) A2 ON (A1.seq = A2.seq) WHEN MATCHED THEN UPDATE SET A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeq WHEN NOT MATCHED THEN INSERT (seq , tips_seq , app_level , rela_seq) VALUES (A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/** * 批量更新保存地區關聯信息 * @ date 2019年2月21日上午11:17:10 * @ return */ @RequestMapping( "/batchSaveTipsAreaConfig" ) @ResponseBody public ResultModel batchSaveTipsConfig(ApprTipsRelatedModel relatedModel) { List<ApprTipsRelatedModel> areaTipsList = new ArrayList<ApprTipsRelatedModel>(); //封裝批量更新的地區列表 String[] areaSeqs = StringUtils.split(relatedModel.getAreaSeq(), "," ); for (String areaSeq : areaSeqs) { ApprTipsRelatedModel areaRelatedModelNew = new ApprTipsRelatedModel(); areaRelatedModelNew.setSeq(commonService.generateUUID()); areaRelatedModelNew.setTipsSeq(relatedModel.getTipsSeq()); areaRelatedModelNew.setAppLevel(NumConstant.COMMON_NUM_TREE); areaRelatedModelNew.setRelaSeq(areaSeq); areaTipsList. add (areaRelatedModelNew); } //批量更新新增數據 try { this.tipsConfigService.batchSaveTipsRelatedConfig(areaTipsList); return ResultModel.success( "保存成功" ); } catch(Exception e) { logger.error( "批量綁定地區異常:{}" +e); throw new SuperControllerException(); } } |
注意要點:
在開發中我遇到一個異常,mybatis打印出來的SQL是這樣的:
1
|
Preparing: MERGE INTO appr_tips_config_related A1 ? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON ( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ? WHEN MATCHED THEN ? ? UPDATE SET A1.seq = A2.seq, A1.tips_seq = A2.tipsSeq, A1.app_level = A2.appLevel, A1.rela_seq = A2.relaSeq ? ? ? WHEN NOT MATCHED THEN ? ? ? INSERT (seq,tip_seq,app_level,rela_seq) ? ? ? ? VALUES (A2.seq , A2.tipsSeq , A2.appLevel , A2.relaSeq) |
可以看出什么問題?打印出的SQL有很多問號,那是因為SQL有空格導致的,所以使用merge函數不用隨便加空格,不然會報錯的
1
|
? USING( ? ? ? ? ? select ? seq , ? tipsSeq , ? appLevel , ? relaSeq from dual ? ? ? ? ) A2 ? ON ( ? ? ? ? ?A1.seq = A2.seq ? ? ?) ? |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/mzq123/p/10424506.html