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表中!!!

相关内容

热门资讯

中国维护国际经贸秩序的立场坚定... 应美方请求,中美经贸高层会谈在瑞士举行。中方在充分考虑全球期待、中方利益、美国业界和消费者呼吁的基础...
来自雪豹之都西宁的“礼物” 雪豹文创。本报记者 陆广涛 摄本报记者 张慧慧“这个设计很有特点!”“妈妈,我想把这个雪豹毛绒公仔带...
330千伏玉树二回接入工程 保... 本报讯 (记者 董洁 通讯员 王宏霞) “地区电力调度控制中心已下令,现在请大家按照调度指令开展作业...
开展家庭教育指导 检护少年健康... 转自:法治日报□ 本报记者 徐鹏  近日,青海省人民检察院联合省人民法院、省妇联、省教育厅、省民政厅...
成都“送体到校”活动落幕 转自:成都日报锦观惠及35000余名学生成都“送体到校”活动落幕 本报讯 (成都日报锦观新闻...
成都蓉城豪取五连胜 转自:成都日报锦观客场4∶0梅州成都蓉城豪取五连胜 本报讯 (成都日报锦观新闻记者 胡锐凯)...
节后错峰游 成都是全国第三大热... 转自:成都日报锦观节后错峰游 成都是全国第三大热门目的地 本报讯 (成都日报锦观新闻记者 杨富...
李在明登记成为韩国总统候选人 转自:成都日报锦观李在明登记成为韩国总统候选人 韩国共同民主党总统候选人李在明10日正式登记成...
结婚领证不用户口簿 还需哪些材... 转自:成都日报锦观结婚领证不用户口簿 还需哪些材料?民政部就婚姻登记“全国通办”政策作七问七答 ...
平凡铸就伟大 劳动闪耀滇池——... 在大渔街道新村社区里,有这样一位令人敬仰的劳动者——刘琼丽,她不仅是民间画的坚守者,更是一名优秀的共...
中医药非遗展讲述“生生之道” 日前,“生生之道——中医药非遗主题展”在北京中国非物质文化遗产馆开幕。展览展示了近50项传统医药类非...
从历史长河到现实岸畔的幽远沉思 王昭君、蔡文姬、冼夫人、刘禹锡、陆游、李清照、柳如是、黄遵宪……这一个个耳熟能详的名字,从杜卫东的书...
当外国人也爱上中国字 阅读提示 4月20日是第16个联合国中文日,由河南省人民政府主办,联合国教科文组织、中日韩合作...
《几生修得到梅花:有所思堂诗稿... 本报讯 近日,朱小平诗集《几生修得到梅花:有所思堂诗稿》由中国华侨出版社再版。这本诗集情真意切,旨...
母爱,铭刻在骨头里 《母爱情深》(中国青年出版社)是厉彦林纪念母亲去世十周年出版的一部散文专著。书中,作者以深沉与哀思、...
宣布停火后 印控克什米尔地区再...   当地时间10日晚,印控克什米尔地区再次传出爆炸声。  地区官员奥马尔·阿卜杜勒(Omar Abd...
绿茵燃情 高原放歌 五月的西宁,丁香绽放,花香四溢。夏都西宁·雪豹之都·丁香之城的绿茵场上,一场足球盛宴——第二届“大美...
首届中国新疆民间艺术季优秀节目... 本报讯(记者 师晓琼 摄影报道)5月9日,首届中国新疆民间艺术季优秀节目巡演青海站活动在经久不息的掌...
佩斯科夫:俄会考虑30天停火提... △佩斯科夫(资料图)  总台记者当地时间5月10日获悉,俄罗斯总统新闻秘书佩斯科夫在接受美国媒体采访...
今天是母亲节 记得跟妈妈说 我... 123海报设计:卢文茂、蒋应杰来源:中国兰州网、兰州发布编辑:柴任翔