Oracle表关联更新几种方法小结

 更新时间:2024年05月24日 11:54:42   作者:zxrhhm  
这篇文章主要介绍了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                   189F5A1099BF6606E0639C0AA8C0F15E
         2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E
 
select * from T_update02;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E
         2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E
         3 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              189F5A1099BF6606E0639C0AA8C0F15E
         2 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              189F5A1099BF6606E0639C0AA8C0F15E
         2 2_updateName                   189F5A1099C06606E0639C0AA8C0F15E
         3 insert03                       189F5A1099C76606E0639C0AA8C0F15E
 
update 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              189F5A1099C46606E0639C0AA8C0F15E
         2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099C66606E0639C0AA8C0F15E
 
select * from T_update02;
 
        ID INFONAME                       SYS_GUID
---------- ------------------------------ ------------------------------------
         1 update_set_exists              189F5A1099C46606E0639C0AA8C0F15E
         2 update_set_cursor              189F5A1099C56606E0639C0AA8C0F15E
         3 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              189F5A1099C46606E0639C0AA8C0F15E
         2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E
         3 cursor is select               189F5A1099C66606E0639C0AA8C0F15E
 
-- 使用用游标更新T_update01的INFONAME字段,使其和T_update02 where id>=2
declare
  cursor cur_my_source is select infoname,id from T_update02;
  begin
     for cur_my_target in cur_my_source loop
       update 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              189F5A1099C46606E0639C0AA8C0F15E
         2 cursor is select               189F5A1099C56606E0639C0AA8C0F15E
         3 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                         189F5A1099BB6606E0639C0AA8C0F15E
         2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15E
 
 
insert 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               189F5A1099BD6606E0639C0AA8C0F15E
         3 3_Name                         189F5A1099BE6606E0639C0AA8C0F15E
 
 
merge 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               189F5A1099BB6606E0639C0AA8C0F15E
         2 2_Name                         189F5A1099BC6606E0639C0AA8C0F15E
         3 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      12008
        206           110       8300
 
TESTUSER@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                     7000
        205
        206
-- 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      12008
        206           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

以上就是Oracle表关联更新几种方法小结的详细内容,更多关于Oracle表关联更新的资料请关注脚本之家其它相关文章!

相关文章

  • Oracle数据库聚合函数XMLAGG详解(全网最全)

    Oracle数据库聚合函数XMLAGG详解(全网最全)

    在SQL中,合函数用于对一组值进行计算并返回单一的值,这篇文章主要给大家介绍了关于Oracle数据库聚合函数XMLAGG的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • oracle使用instr或like方法判断是否包含字符串

    oracle使用instr或like方法判断是否包含字符串

    使用contains谓词有个条件,那就是列要建立索引,本节主要介绍了oracle使用instr或like方法判断是否包含字符串,需要的朋友可以参考下
    2014-08-08
  • [Oracle] 解析在没有备份的情况下undo损坏怎么办

    [Oracle] 解析在没有备份的情况下undo损坏怎么办

    Oracle在运行中很不幸遇到undo损坏,当然最好的方法是完全恢复,但如果是在没有备份的情况下undo损坏怎么办?以下就为大家介绍出现这种情况的解决办法,需要的朋友参考下
    2013-07-07
  • VMware中linux环境下oracle安装图文教程(一)

    VMware中linux环境下oracle安装图文教程(一)

    刚刚接触ORACLE的人来说,从那里学,如何学,有那些工具可以使用,应该执行什么操作,一定回感到无助。所以在学习使用ORACLE之前,首先来安装一下ORACLE 10g,在来掌握其基本工具。俗话说的好:工欲善其事,必先利其器。作为一个新手,我们还是先在VMware虚拟机里安装吧。
    2014-08-08
  • 详解Oracle在out参数中访问光标

    详解Oracle在out参数中访问光标

    这篇文章主要介绍了详解Oracle在out参数中访问光标的相关资料,这里提供实例代码帮助大家学习理解这部分内容,希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • oracle数据库被锁定的解除方案

    oracle数据库被锁定的解除方案

    文章主要介绍了如何查询和解除Oracle数据库中被锁定的表,通过执行特定的SQL语句,可以获取被锁定表的相关信息,并通过指定会话ID和序列号来解除锁定,同时,文章提醒执行此操作时需要谨慎,确保了解其影响
    2024-11-11
  • Oracle数据库中字符串截取最全方法总结

    Oracle数据库中字符串截取最全方法总结

    Oracle提供了多种截取字符串的操作方法,可以根据具体需求选择合适的方法进行操作,下面这篇文章主要给大家总结介绍了关于Oracle数据库中字符串截取的最全方法,需要的朋友可以参考下
    2024-03-03
  • oracle 重置sys密码的方法介绍

    oracle 重置sys密码的方法介绍

    近期安装完oracle 10g后,竟发现将安装时设置的系统密码忘记。在同事的帮助下通过一下方法解决,遇到同样问题的朋友可以参考
    2012-11-11
  • Oracle实现动态SQL的拼装要领

    Oracle实现动态SQL的拼装要领

    这篇文章主要介绍了Oracle实现动态SQL的拼装要领,对于Oracle的进一步学习来说非常重要,需要的朋友可以参考下
    2014-07-07
  • 部署Oracle 12c企业版数据库( 安装及使用)

    部署Oracle 12c企业版数据库( 安装及使用)

    这篇文章主要介绍了部署Oracle 12c企业版数据库( 安装及使用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论