Oracle表关联更新几种方法

1、测试表及数据准备

create table T_update01(ID int ,infoname varchar2(32),sys_guid varchar2(36));
create table T_update02(ID int ,infoname varchar2(32),sys_guid varchar2(36));insert into T_update01
select 1,N'1_updateName',sys_guid() from dual
union
select 2,N'2_updateName',sys_guid() from dual;
commit;insert into T_update02
select 1,N'update_set_exists',sys_guid() from dual;
insert into T_update02
select 2,N'update_set_cursor',sys_guid() from dual;
insert into T_update02
select 3,N'3_Name',sys_guid() from dual;
commit;-- 查询表T_update01、T_update02
select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 1_updateName                   189F5A1099BF6606E0639C0AA8C0F15E2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15Eselect * from T_update02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E

2、update set column ... where exists

2.1、update set 单列字段

-- update set 单列字段,更新满足关联条件的所有数据
update T_update01 T1
set infoname=(select T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where exists (select 1 from T_update02 T2 where T2.ID=T1.ID );-- update set 单列字段 ,更新满足特定条件ID=1的数据
update T_update01 T1
set infoname=(select T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where T1.ID=1;-- 本次执行更新满足特定条件T_update01表的ID=1
SCOTT@prod02> select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099BF6606E0639C0AA8C0F15E2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E

2.2、update set 多列字段

-- T_update01表多插入一行数据
insert into T_update01
select 3,N'insert03',sys_guid() from dual;
commit;select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099BF6606E0639C0AA8C0F15E2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E3 insert03                       189F5A1099C76606E0639C0AA8C0F15Eupdate T_update01 T1 
set (sys_guid,infoname) = (select T2.sys_guid,T2.infoname from T_update02 T2 where T2.ID=T1.ID)
where exists (select 1 from T_update02 T2 where T2.ID=T1.ID );
commit;
-- 更新后检查,sys_guid,infoname两列的值和T_update02一样了
select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E3 3_Name                         189F5A1099C66606E0639C0AA8C0F15Eselect * from T_update02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E

3、使用游标

-- T_update02数据更新一下,方便使用游标更新的结果显示
update T_update02 set INFONAME='cursor is select' where id>=2;
commit;
select * from T_update02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E3 cursor is select               189F5A1099C66606E0639C0AA8C0F15E-- 使用用游标更新T_update01的INFONAME字段,使其和T_update02 where id>=2
declarecursor cur_my_source is select infoname,id from T_update02;beginfor cur_my_target in cur_my_source loopupdate T_update01 set infoname=cur_my_target.infoname where id=cur_my_target.id;end loop;commit;end;/-- 检查查询结果
select * from T_update01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E3 cursor is select               189F5A1099C66606E0639C0AA8C0F15E

4、merge into子句

create table T_merg01(ID int ,infoname varchar2(32),sys_guid varchar2(36));
create table T_merg02(ID int ,infoname varchar2(32),sys_guid varchar2(36));insert into T_merg01
select 1,N'1_Name',sys_guid() from dual
union
select 2,N'2_Name',sys_guid() from dual;
commit;select * from T_merg01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 1_Name                         189F5A1099BB6606E0639C0AA8C0F15E2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15Einsert into T_merg02
select 1,N'merge_into_Name1',sys_guid() from dual;insert into T_merg02 
select 3,N'3_Name',sys_guid() from dual;select * from T_merg02;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 merge_into_Name1               189F5A1099BD6606E0639C0AA8C0F15E3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15Emerge into T_merg01 T1
using T_merg02 T2 on (T1.id=T2.id)
when matched then update set infoname=T2.infoname
when not matched then insert (ID,infoname,sys_guid) values(T2.ID ,T2.infoname,T2.sys_guid);commit;select * from T_merg01;ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------1 merge_into_Name1               189F5A1099BB6606E0639C0AA8C0F15E2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15E3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15E
-- 可以发现T_merg01表的ID=1的INFONAME=merge_into_Name1和T_merg02表ID=1的值一样了
-- 可以发现T_merg01表多了一行数据是T_merg02表ID=3的这一行数据

5、Oracle 23c/AI 新特性

不论是已发版本Oracle23c free还是最终发布的长期支持的Oracle23Ai,表关联更新update和删除delete语句易用且更加优雅,类似SQLServer的关联更新

以下操作基于的环境

SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Fri May 17 11:17:54 2024
Version 23.2.0.0.0


5.1、关联更新update

TESTUSER@FREEPDB1> create table t_emp as select EMPLOYEE_ID,DEPARTMENT_ID,SALARY from employees;Table created.TESTUSER@FREEPDB1> desc t_emp;Name                                      Null?    Type----------------------------------------- -------- ----------------------------EMPLOYEE_ID                                        NUMBER(6)DEPARTMENT_ID                                      NUMBER(4)SALARY                                             NUMBER(8,2)TESTUSER@FREEPDB1> select * from t_emp where DEPARTMENT_ID=110;EMPLOYEE_ID DEPARTMENT_ID     SALARY
----------- ------------- ----------205           110      12008206           110       8300TESTUSER@FREEPDB1> update t_emp set DEPARTMENT_ID=null,SALARY=null where DEPARTMENT_ID=110;2 rows updated.TESTUSER@FREEPDB1> commit;Commit complete.TESTUSER@FREEPDB1> select * from t_emp where DEPARTMENT_ID is null;EMPLOYEE_ID DEPARTMENT_ID     SALARY
----------- ------------- ----------178                     7000205206
-- oracle 23c SQL增强 表关联更新        
TESTUSER@FREEPDB1> update t_emp t1 set t1.DEPARTMENT_ID=t2.DEPARTMENT_ID,t1.SALARY=t2.SALARY from employees t2 where t2.EMPLOYEE_ID=t1.EMPLOYEE_ID and t1.DEPARTMENT_ID is null;3 row updated.TESTUSER@FREEPDB1> commit;Commit complete.TESTUSER@FREEPDB1> select t1.* from t_emp t1 where t1.DEPARTMENT_ID=110;
EMPLOYEE_ID DEPARTMENT_ID     SALARY
----------- ------------- ----------205           110      12008206           110       8300

5.2、关联删除delete

TESTUSER@FREEPDB1> delete t_emp t1 from employees t2 where t2.EMPLOYEE_ID=t1.EMPLOYEE_ID and t2.DEPARTMENT_ID=110;45 rows deleted.TESTUSER@FREEPDB1> commit;Commit complete.TESTUSER@FREEPDB1> select t1.* from t_emp t1 where t1.DEPARTMENT_ID=110;no rows selected

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java如何获取IP和IP的归属地?

在Java中,获取IP地址通常指的是获取本地机器的IP地址或者通过某种方式(如HTTP请求)获取的远程IP地址。代码案例如下: 而要获取IP的归属地(地理位置信息),则通常需要使用第三方IP地址查询服务,我…

c++ 排序算法merge使用要求

在C中&#xff0c;std::merge是一个算法&#xff0c;它用于合并两个已排序的范围&#xff08;例如数组或容器中的一部分&#xff09;到一个新的范围中。这个函数在<algorithm>头文件中定义。 输入范围必须已排序 std::merge要求输入的两个范围都必须是已排序的&#xf…

23种设计模式顺口溜

口诀&#xff1a; 原型 抽风 &#xff0c;单独 建造 工厂 &#xff08;寓意&#xff1a;&#xff08;这里代指本来很简单的东西&#xff0c;却要干工厂这里复杂的业务&#xff09; 抽风&#xff1a;抽象工厂单独&#xff1a;单例桥代理组合享元适配器&#xff0c;&#xff0…

Microsoft VBA Excel 去重小工具

问题简述 在本工作表中&#xff0c;A1:B3单元格样式如下&#xff0c;通过名称管理器B列的单元格被命名为"LinkFile"、“SheetName”、“InputArea”&#xff0c;请实现以下功能&#xff1a;读取Excel文件中的数据&#xff0c;去除重复的数据&#xff0c;并记录每个数…

亚马逊云科技介绍

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、亚马逊云科技云计算1.1 云计算的优势 二、领先的云平台三、亚马逊云科技区域的全球网络…

最简单的,在mac笔记本上安装Unix-v6系统,进行“Unix内核源码剖析”

Unix V6 已经是 1975 年的系统了&#xff0c;但是其源代码拢共只有 1w 行左右&#xff0c;并且使用了 C 语言&#xff08;K & R 之前的标准&#xff09;&#xff0c;还是现代操作系统的鼻祖&#xff0c;所以说是初学者最好的研究对象。 安装模拟器 brew install simh …

【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客 下一篇&#xff1a; 目录 1.索引合并-交集访问算法 2.索引合并联合访问算法 3.索引合并-排序联合访问算法 4.影响索引合…

平衡发展与环保:理性看待地下式污水处理厂建设|中联环保圈

这些年啊&#xff0c;随着城市化进程越来越快&#xff0c;还有环境保护意识不断提高&#xff0c;这地下式污水处理厂慢慢就成了热门的建设趋势了。据相关统计&#xff0c;全球现在运行着 200 多座地下式污水处理厂呢&#xff0c;咱国家建成和在建的数量也差不多快到 200 座啦。…

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

STM32入门笔记(02):USART串口通信注意事项笔记(SPL库函数版)

这是通过串口通信发送过来的数据&#xff0c;里面包括了故障码&#xff0c;电压&#xff0c;电流&#xff0c;频率等信息&#xff0c;请你用STM32f103系列单片机的串口1读取该数据并解析出电压和电流是多少&#xff1f; 要用STM32F103系列单片机的串口1读取并解析发电机上的逆…

【Django项目】 音乐网站spotify复刻

代码&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;该项目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口获取。

docker 命令总结

导出镜像下载 centos 镜像 docker pull centos:centos7.7.1908 常用命令 docker ps 查看正在运行的容器 docker ps -a 查看所有容器 docker images 查看本地已有镜像 停止所有容器 docker stop $(docker ps -aq) 停止某个容器 docker stop 容器名称 删除所有容器 dock…

Java基础入门day54

day54 servlet升级03 特点 当前设计又有一个问题&#xff0c;我们目前可以做到一个实体类用一个servlet&#xff0c;比如Student类的所有crud方法都可以在StudentServlet中的service方法中进行动态处理。假如又有User类&#xff0c;我们就要在UserServlet中设计service方法&a…

探索文档识别技术在加强教育资源共享与合作中的潜力

在数字化浪潮不断推进的今天&#xff0c;教育资源的共享与合作已经成为提高教学质量和效率的关键因素。文档识别技术作为一项强大的工具&#xff0c;在这一过程中发挥着至关重要的作用。本文旨在探讨如何通过文档识别技术的应用&#xff0c;促进教育资源的有效共享与教师、学校…

MySQL主从复制故障:“ Slave_SQL_Running:No“ 两种解决办法

问题 今天搭建MySQL的主从复制&#xff0c;查看从机状态时show slave status\G&#xff0c;发现这个参数为NO&#xff0c;导致主从复制失败。 Slave_SQL_Running: No 后面上网查阅了一下资料&#xff0c;大概就是因为在连接支持数据库后&#xff0c;也就是这个命令后&#xff…

Adobe产品安装目录修改

进入安装包目录&#xff0c;进入到products文件夹 编辑driver.xml文件 将“InstallDir”修改为你需要安装的软件的目录&#xff0c;我这里是修改到D:\Adobe目录 <DriverInfo> <ProductInfo> xxxxxxxxxxxxxxxxx </ProductInfo> 拷贝RequestInfo这部分…

c-lodop 打印面单 内容串页

场景&#xff1a;使用c-lodop程序调取打印机连续打印多张快递单时&#xff0c;上页内容&#xff0c;打到了下一页了 问题原因&#xff1a; 由于是将所有面单内容放到了一个页面&#xff0c;c-lodop 在打印时&#xff0c;发现一页放不下&#xff0c;会自动分割成多页 页面元素…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中&#xff0c;如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收&#xff1f; 问题描述 在postman中测试接口&#xff0c;报错Error&#xff1a;Abort&#xff0c;或者显示返回数据校验失…