update与merge基本语法规则、异同点、使用场景

UPDATE更新数据SQL
UPDATE /+append parallel(A,8) nologging/ CRSMAK.M_CM_GS_BILL_DISH_INFO A --票据贴现信息
SET A.YEAR_PAR_AMT =
(SELECT /parallel(B,8)/
YEAR_PAR_AMT
FROM (SELECT BIZ_ID, SUM(NVL(PAR_AMT, 0)) YEAR_PAR_AMT --年累计票面金额
FROM CRSMAK.M_CM_GS_BILL_DISH_INFO B --票据贴现信息
WHERE RPT_END_DT >= '20210101' --数据基准日期
AND RPT_END_DT <= '20210105' --数据基准日期
AND SUBJECT_ID = '131201' --科目编号
AND NVL(TODAY_ACCRUED_INT, 0) > 0 --当日应计利息
GROUP BY BIZ_ID) B
WHERE A.BIZ_ID = B.BIZ_ID
AND A.DISCNT_TYPE_CD = '2' --贴现类型代码 2-转贴现
AND A.RPT_END_DT = '20210106');
COMMIT;
--MERGE更新数据SQL
MERGE INTO CRSMAK.M_CM_GS_BILL_DISH_INFO A --票据贴现信息
USING (SELECT BIZ_ID, YEAR_PAR_AMT
FROM (SELECT BIZ_ID, SUM(NVL(PAR_AMT, 0)) YEAR_PAR_AMT --年累计票面金额
FROM CRSMAK.M_CM_GS_BILL_DISH_INFO B --票据贴现信息
WHERE RPT_END_DT >= '20210101' --数据基准日期
AND RPT_END_DT <= '20210105' --数据基准日期
AND SUBJECT_ID = '131201' --科目编号
AND NVL(TODAY_ACCRUED_INT, 0) > 0 --当日应计利息
GROUP BY BIZ_ID)) B
ON (A.BIZ_ID = B.BIZ_ID AND A.DISCNT_TYPE_CD = '2' AND A.RPT_END_DT = '20210106')
WHEN MATCHED THEN
UPDATE SET A.YEAR_PAR_AMT = B.YEAR_PAR_AMT;
COMMIT;

一、MERGE 基本语法规则:
MERGE INTO 目标表 a
USING 源表 b
ON (a.条件字段1=b.条件字段1 AND a.条件字段2=b.条件字段2 …)
WHEN MATCHED THEN UPDATE SET a.更新字段=b.字段
WHEN NOT MATCHED THEN INSERT INTO a(字段1,字段2…) VALUES(值1,值2…)

二、UPDATE与MERGE异同点:
一、共同点:都可以做更新操作
二、不同点:
1、update语句更新需要根据索引或者数据列遍历所有行
2、merge只需要遍历一次表,可以更新可以插入
3、修改一条已有的数据:使用update的时候不管出现什么情况都会去修改(即覆盖原有数据),而merge会去查询原有数据,如果一样的话,不会取修改,只有出现不同的内容的时候才会取修改。
4、MERGE 还有个特点:当修改的数据ID找不到的时候,update会报错,而merge却会把数据新建id存入数据库。
5、MERGE可以同时做插入(NOT MATCHED的时候)
6、MERGE不会强制要求不被更新的表具有唯一或者主键约束
例如:MERGE a USING b ON (…)这里不会要求B具有唯一约束或者主键约束。当然肯定还是要求b表只能返回一条记录。
很多UPADTE语句调整为等效语句的时候会遇到这张强制约束的问题,但merge不存在。
7、在某些情况下,MERGE效率更高。
这是因为写法导致的,并不是说merge本身比update高效。例如很多对应SQL不是很精通的人员可能会这样写一个。

三、适用场景:
一、update适用于:
1、更改单表速度快稳定性好
2、某字段即是过滤条件优势更新字段,且该字段有选择性很强的索引时“UPDATE A SET STATUS=1 WHERE ID=1 AND STATUS =2 AND IDC IN (表)”
二、MERGE适用于:
1、根据一张表或多张表联合查询的连接条件对另一张表进行查询,连接条件匹配上的进行update,无法匹配的执行insert可以直接用merge实现,执行效率要高于insert+UPDATE
2、“UPDATE A SET i=(SELECT i FROM b WHERE a.id=b.id) WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id=b.id)”NOT exists部分需要额外消耗,可以用merge避免。
MERGE缺点:
1、不支持更改字段放入on(会报错 ora-38104:无法更新on子句中引用的列:XX)
2、有些情况merge过滤条件不放入on可能会有其他性能问题(例子2、3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值