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

相关内容

热门资讯

渤健与卫材称欧洲监管机构重申对...   渤健和卫材周五表示,欧洲药品管理局人用药品委员会(Committee for Medicinal...
ALEX小王子小公主仓鼠笼适合... ALEX小王子小公主仓鼠笼适合养哪些SS够用吗?SS长大还需要换大笼子吗?三线类大概可以用到多大呢不...
邹磊与鄂尔多斯市委书记李理、市... 2月28日,国家能源集团党组书记、董事长邹磊在集团总部与鄂尔多斯市委书记李理,鄂尔多斯市委副书记、市...
诟莫大於卑贱,而悲莫甚於穷困。... 诟莫大於卑贱,而悲莫甚於穷困。久处卑贱之位,困苦之地,非世而恶利,自讬於无为,此非士之情也。这句话什...
邹磊会见榆林市委书记、市长张胜... 2月27日,国家能源集团党组书记、董事长邹磊在西安会见榆林市委书记、市长张胜利,双方围绕深化央地合作...
栖在字典中的意思 栖在字典中的意思1、读音[ qī ]的释义:鸟在树枝或巢中停息。也泛指居住或停留:~止。两~。相关组...
山无棱,天地合,乃敢与君绝. 山无棱,天地合,乃敢与君绝.请帮我翻译一下!尤其是”棱”,怎么理解?棱角的意思啊。就是山没有棱角,手...
2025年内蒙古将投入7.5亿... 北疆财经消息(石茹意)内蒙古自治区人民政府新闻办公室2月28日举行新一轮找矿突破战略行动工作进展新闻...
抢农时抓春耕 科技赋能壮产业... 转自:梧州发布2月27日,市委副书记、市长李振品深入蒙山县,调研春耕备耕和六堡茶产业发展,强调要贯彻...
两校联合命题 提升教师素养 转自:新安晚报   2月25日下午,合肥一六八玫瑰园南校教育集团临湖学校为落实“双减”政策,提升教师...
美媒称美乌将共享乌矿产和能源项... 当地时间2月28日,据福克斯新闻网消息,其审阅的文件副本显示,美国总统特朗普与乌克兰总统泽连斯基当日...
谁知道草房子这本小说有没有续集 谁知道草房子这本小说有没有续集没有啦,不过有一本叫的书,应该不是续集好象没有续集有,名叫红瓦黑瓦
雷军,深夜发微博!小米SU7 ... 深夜,雷军微博发布消息,“谢谢大家支持!”,并配图:小米SU7 Ultra,大定突破15000台。同...
顺利升级,这个东北省会进入“决... 每经记者 刘旭强    每经编辑 杨欢 图片来源:摄图网_507723125省会城...
一年365天浪漫营业 探寻广州... 来源:中国新闻网 中新网广州2月28日电 题:一年365天浪漫营业 探寻广州花卉“种业芯片”密码中新...
密集下调民营银行走下利率高地 一直以高存款利率揽客的民营银行也开启了降息模式。《国际金融报》记者注意到,重庆富民银行、中关村银行等...
演员车晓是几线呢,拍戏身价多少... 演员车晓是几线呢,拍戏身价多少,哪些演员和她一样漂亮有吗,谢谢了我有的~看简介嗷~
天外世界炼金术士支线怎么过 业... 天外世界炼金术士支线怎么过 业余炼金术士支线流程 天外世界业余炼金术士支线的流程是玫瑰路镇的沃恩科斯...
司法部:3月1日起全面推行在线... 转自:新安晚报   为更加方便群众申请和参加行政复议,司法部对全国行政复议行政应诉工作平台进行升级完...
倪迪:推进《船员法》立法正当其... 转自:上观新闻履职3年,倪迪连续3年锚定“海员群体”。手中的建议已从薄纸化为厚实的数据包:涵盖近10...