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

相关内容

热门资讯

难舍最后这一面     2022年,坤叔与孩子们在一起。  坤叔走了。  4月13日清早,吴梅花看到这条消息,“感觉...
乐都梨花如雪 邀您共赴春日之约 百年梨树竞相绽放。游客赏梨花。游客畅游在梨花园,享受春日美好时光。拍照留念。本报讯(西海新闻记者 吕...
英国财政大臣:不与中国接触是“... 来源:中国新闻网 中新社伦敦4月19日电 英国财政大臣蕾切尔·里夫斯日前接受英国媒体采访时表示,不与...
科技+生态 荒滩变绿色乐园 供电公司工作人员井国权、汪生平在种植大棚内开展安全用电检查。通讯员 沈仪 摄通讯员 喇小青 沈仪 春...
融入日常、抓在经常 中央八项规定是改进作风的第一步,是作为共产党人应该做到的基本要求,需融入日常、抓在经常,常学常新。学...
沃尔沃美国工厂将裁800人 沃尔沃集团(Volvo Group)发言人周五(4月18日)表示,由于市场不确定性和美国总统特朗普征...
美国还能去吗? 新华社北京4月19日电 最近几周,美国政府取消逾千名国际学生签证或合法身份一事持续发酵。18日,超过...
变声宝宝怎么调成娃娃音 变声宝宝怎么调成娃娃音怎么调?调节音调,下面录音改成效果音。慢慢调试
神州数码:公司已推出神州问学P... 每经AI快讯,有投资者在投资者互动平台提问:贵公司能否为个人PC进行企业级AI的赋能?其与现有AI ...
孙悟空是由仙石变化而来这一形象... 孙悟空是由仙石变化而来这一形象寓意着什么?这天天幸福。没错,就天天幸福。寓意着孙悟空的神通广大意思就...
先进数通(SZ300541):... 投资者提问:是否涉及B2B,跨境电商,跨境支付,跨境物流,等业务?董秘回答(先进数通SZ300541...
泽连斯基称乌克兰全境响起防空警... 央视新闻消息,乌克兰总统泽连斯基19日在官方社交平台回应俄宣布停火称,在俄宣布停火时,乌克兰全境已经...
全国首场长期照护师考试在江苏南... 转自:新华网  4月19日,考生在位于南通市崇川区的长期照护师职业技能等级认定考点进行理论知识考试。...
鹰眼预警:麒盛科技营业收入下降 Hehson财经上市公司研究院|财报鹰眼预警4月19日,麒盛科技发布2024年年度报告,审计意见为无...
机器人跑步为什么难?它的每一步... 转自:千龙网19日上午,首个人形机器人半程马拉松在北京亦庄鸣枪开跑。把机器人这个词拆解一下,有“机器...
草台班子!债券文件,一连串低级... 收到小伙伴投稿:4月17日浙江省国有资本运营有限公司2025年面向专业投资者公开科技创新发行公司债券...
先进数通:公司本身不做B2B电... 证券之星消息,先进数通(300541)04月19日在投资者关系平台上答复投资者关心的问题。投资者:是...
鹰眼预警:三人行净资产收益率持... Hehson财经上市公司研究院|财报鹰眼预警4月19日,三人行发布2024年年度报告,审计意见为标准...
比预售低2.9万!蔚来萤火虫正... 今天,蔚来旗下第三品牌“萤火虫”首款车型正式上市,指导价11.98万元起,共推出自在版和发光版两款车...
Nat. Commun. | ... 2025年4月16日,南京农业大学农学院王秀娥教授团队在《Nature Communications...