Oracle中merge Into的用法
创始人
2024-05-29 06:23:24
0

Oracle中merge Into的用法

使用场景

在操作数据库时,数据存在的情况下,进行update操作;不存在的情况下,进行insert操作;在Oracle数据库中,能够使用merge into来实现。

基本语法

merge into table_name  alias1                  -- 目标表 可以用别名表示
using (table|view|sub_query) alias2            -- 数据源表 可以是表、视图、子查询等
on (join condition)                            -- 关联条件 
when matched then                              -- 当关联条件成立时 更新,删除,插入的where部分为可选 update table_name set col1 = colvalue  where ……        -- 更新操作delete from table_name  where  col2=colvalue  where……  -- 删除操作 -- 可以只更新不删除 也可以只删除不更新-- 如果更新和删除同时存在,删除的条件一定要在更新的条件内,否则数据不能删除
when not matched then                                    -- 当关联条件不成立时   
insert (col3) values (col3values)  where……               -- 关联条件进行插入操作

演示示例

为了演示,下面提供了两张测试表以及数据:

-- 测试表(1) tmp 
create table tmp
(id               VARCHAR2(20) not null,tmp_name        VARCHAR2(120),tmp_date  VARCHAR2(8),is_delete        VARCHAR2(1),creator          VARCHAR2(24),created_at       NUMBER(20),updater          VARCHAR2(24),updated_at       NUMBER(20)
)
-- 测试表(2) temp
create table temp
(id               VARCHAR2(20) not null,tmp_id        VARCHAR2(20),temp_name  VARCHAR2(120),temp_date  VARCHAR2(8),is_delete        VARCHAR2(1),creator          VARCHAR2(24),created_at       NUMBER(20),updater          VARCHAR2(24),updated_at       NUMBER(20)
)
-- 测试数据
truncate table tmp;
insert into tmp (ID, TMP_NAME, TMP_DATE, IS_DELETE, CREATOR, CREATED_AT, UPDATER, UPDATED_AT)values ('00001', 'tmp测试数据1', '20220628', '0', 'admin', null, null, null);
insert into tmp (ID, TMP_NAME, TMP_DATE, IS_DELETE, CREATOR, CREATED_AT, UPDATER, UPDATED_AT)values ('00002', 'tmp测试数据2', '20221223', '0', 'admin', null, null, null);
insert into tmp (ID, TMP_NAME, TMP_DATE, IS_DELETE, CREATOR, CREATED_AT, UPDATER, UPDATED_AT)values ('00003', 'tmp测试数据3', '20210927', '0', 'admin', null, null, null);
truncate table temp;
insert into temp (ID, TMP_ID, TEMP_NAME, TEMP_DATE, IS_DELETE, CREATOR, CREATED_AT, UPDATER, UPDATED_AT)values ('E74C9EC', '00001', 'temp测试数据1', '20210823', '0', 'admin', null, null, null);
insert into temp (ID, TMP_ID, TEMP_NAME, TEMP_DATE, IS_DELETE, CREATOR, CREATED_AT, UPDATER, UPDATED_AT)values ('39978FC', '00002', 'temp测试数据2', '20211012', '0', 'admin', null, null, null);
insert into temp (ID, TMP_ID, TEMP_NAME, TEMP_DATE, IS_DELETE, CREATOR, CREATED_AT, UPDATER, UPDATED_AT)values ('88640EF', '00006', 'temp测试数据3', '20211121', '0', 'admin', null, null, null);
commit;

tmp表数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pmolJugI-1677982321930)(Oracle%E4%B8%ADmerge%20Into%E7%9A%84%E7%94%A8%E6%B3%95.image/image-20230304152805601-16779148878521.png)]

temp表数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lryP65OA-1677982321931)(Oracle%E4%B8%ADmerge%20Into%E7%9A%84%E7%94%A8%E6%B3%95.image/image-20230304152832175.png)]

两表的关联关系

select t.*,tt.* from tmp t,temp tt where t.id = tt.tmp_id;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqkekNP8-1677982321932)(Oracle%E4%B8%ADmerge%20Into%E7%9A%84%E7%94%A8%E6%B3%95.image/image-20230304153002916-16779150044203.png)]

merge into示例:

merge into temp  t   
using  tmp tt on (t.tmp_id = tt.id)
when matched then           update set t.temp_name ='xxkfz' where t.tmp_id = '00001'delete where (t.tmp_id  =  '00002')
when not matched then    insert (t.id, t.tmp_id,t.temp_name,t.temp_date,t.is_delete) values (sys_guid(),tt.id,tt.tmp_name,tt.tmp_date,tt.is_delete);commit;

几点说明:

  • 被更新的表写在merge into之后
  • 更新来源数据表写在using之后,并将相关字段查询出来,为查询结果定义别名
  • on 之后表示更新满足的条件
  • when matched then:表示当满足条件时要执行的操作
  • update set: 被更新表.被更新字段 = 更新表.更新字段—此更新语句不同于常规更新语句
  • when not matched then:表示当不满足条件时要执行的操作。
  • insert (被更新表.被更新字段,…) values (更新表.更新字段,…)
  • commit:表示提交事务

执行完成以上语句后,结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31VFYQxq-1677982321932)(Oracle%E4%B8%ADmerge%20Into%E7%9A%84%E7%94%A8%E6%B3%95.image/image-20230304153734908-16779154570755.png)]

发现:temp表中tmp_id为00002的数据没有被删除。

why???

因为:如果更新和删除同时存在,删除的条件一定要在更新的条件内,否则数据不能删除!!!

为了更好的测试该场景,修改如下:

merge into temp  t    
using  tmp tt on (t.tmp_id = tt.id)
when matched then              update set t.temp_name ='xxkfz' where t.tmp_id  in ('00001','00002')delete where (t.tmp_id  =  '00002')
when not matched then    insert (t.id, t.tmp_id,t.temp_name,t.temp_date,t.is_delete) values (sys_guid(),tt.id,tt.tmp_name,tt.tmp_date,tt.is_delete);commit;

再次重置两表测试数据,执行以上语句,结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2AI5Dvhx-1677982321933)(Oracle%E4%B8%ADmerge%20Into%E7%9A%84%E7%94%A8%E6%B3%95.image/image-20230304154721686-16779160431659.png)]

发现tmp_id为00001的数据temp_name字段成功更新为xxkfz;tmp_id为00002的数据成功删除!!!

对于没有匹配的数据:tmp表id为00003的数据也成功插入带temp表中!!!

5Dvhx-1677982321933)]

发现tmp_id为00001的数据temp_name字段成功更新为xxkfz;tmp_id为00002的数据成功删除!!!

对于没有匹配的数据:tmp表id为00003的数据也成功插入带temp表中!!!

相关内容

热门资讯

最近我老是要训练打字,搞到我的... 最近我老是要训练打字,搞到我的手很累,打字速度越来越慢。有什么办法?我一宿背下五笔字根,五十六岁。你...
哪本小说女主叫杨小四,男主叫城... 哪本小说女主叫杨小四,男主叫城昊“天使街23号”金月夜“恶魔法则”万圣节“1王9帅12宫”寒秋“幸运...
挑的三声可以组什么词语 挑的三声可以组什么词语挑灯 挑拨 挑起
如何礼貌的拒绝异性的约会邀请? 如何礼貌的拒绝异性的约会邀请?我觉得你想礼貌的拒绝异性的约会,最好是通过短信电话或者请其他朋友告知,...
张艺谋一共拍了多少部电影?最经... 张艺谋一共拍了多少部电影?最经典的一部是什么呢?他拍的电影特别的多啊,而且很多都特别的受欢迎,经典的...
""兵不厌... ""兵不厌诈"这是一条很好的军事原则,可以用诚信解释吗?为什么兵不厌诈,汉语成语,出自《韩非子·难一...
魔兽世界新手升级问题 魔兽世界新手升级问题塔轮米尔 啊拉系高地都可以去了ALX吧..哎`。30到45卖一张卡.用15个小时...
在《跨次元新星》中,哪一期的虚... 在《跨次元新星》中,哪一期的虚拟人物最令你记忆犹新呢?我非常喜欢观看这个综艺节目,最喜欢观看的一期就...
匆匆那年书上陈寻甩了方茴的是哪... 匆匆那年书上陈寻甩了方茴的是哪一章卷八 分开方茴去礼堂看见陈寻沈晓棠一起唱《匆匆那年》,她给陈寻打...
长尾风筝好放吗 长尾风筝好放吗好放。风筝的好放与难放都是取决于风筝大小,风筝小就好放,风筝大就难放,由于体积和重量的...
《猴子捞月》的故事告诉我们什么... 《猴子捞月》的故事告诉我们什么道理?《猴子捞月》的故事告诉我能的道理是遇到事情要多动脑筋,多思考,多...
终南山唐王维的诗意 终南山唐王维的诗意终南山王维 唐 太乙近天都,连山接海隅。白云回望合,青霭入看无。分野中峰变,阴晴众...
女朋友经常嫌弃我、打击我,在朋... 女朋友经常嫌弃我、打击我,在朋友面前把我说的一文不值,我要分手吗?女朋友经常打击你,并且在朋友面前不...
怎么才可以做到体贴她? 怎么才可以做到体贴她?在她最需要你的时候你能第一时间出现在她面前从来不会过多地忽略她的感受不会让她受...
明智的放弃胜过于盲目的执着意思... 明智的放弃胜过于盲目的执着意思?就是指放弃其实是为了更好的得到,是在放弃中进行新一轮的进取,绝不是三...
医道官途什么时候完结啊 医道官途什么时候完结啊个人觉得章鱼哥,太能写啦,他在一点一点的磨,也许到月票不好时就该完了估计012...
谁能教我白话? 谁能教我白话?有两种:一是问广东广西的朋友教;二是自学。你到书店或者书滩买本学白话的书、里面有释音、...
介绍一些自传的书籍来看看? 介绍一些自传的书籍来看看?就是一些人生的经历呀!成功人士的自传都OK!
(今日财金)正规红中癞子麻将群... 微【ab120590】 【mj120590】【tj525555】广东一元一分红中麻将推倒胡等麻将群,...
《麻将介绍》一元一分血战麻将... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...