SQL/Oracle 两表关联更新

Oracle/MySQL/SQL Server关联更新实战:语法、性能优化与避坑指南 在数据库操作中,关联更新(UPDATE with JOIN)是一种基于关联关系,用一个的数据批量修改另一个数据的关键技术。其核心原理是通过JOIN操作建立临时结果集,再对目标进行定向更新,常用于数据同步、状态维护等场景。从技术价值看,它能确保数据一致性,避免逐条更新的低效与错误。在应用层面,无论是用户积分同步、订单状态刷新,还是数据仓库的ETL流程,都离不开高效、安全的关联更新。本文聚焦实战,针对Oracle、MySQLSQL Server三大主流数据库,深入解析其关联更新的标准语法、性能优化策 阅读详情


   有TA, TB两表,假设均有三个栏位id, name, remark. 现在需要把TB表的name, remark两个栏位通过id关联,更新到TA表的对应栏位。

建表脚本:

drop table TA;
create table TA
(
id number not null,
name varchar(10) not null,
remark varchar(10) not null
);

drop table TB;
create table TB
(
id number not null,
name varchar(10) not null,
remark varchar(10) not null
);

truncate table TA;
insert into TA values(1, 'Aname1', 'Aremak1');
insert into TA values(2, 'Aname2', 'Aremak2');
commit;

truncate table TB;
insert into TB values(1, 'Bname1', 'Bremak1');
insert into TB values(3, 'Bname3', 'Bremak3');
commit;

select * from TA;
select * from TB;

SQLServer/Oracle版本的Update写法分别如下:

1. SQLServer

update TA set name=b.name, remark=b.remark from TA a inner join TB b on a.id = b.id

或者

update TA set name=b.name, remark=b.remark from TA a, TB b where a.id = b.id

注意不要在被更新表的的栏位前面加别名前缀,否则语法静态检查没问题,实际执行会报错。

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "a.name" could not be bound.

2. Oracle

update TA a set(name, remark)=(select b.name, b.remark from TB b where b.id=a.id) 
where exists(select 1 from TB b where b.id=a.id)

注意如果不添加后面的exists语句,TA关联不到的行name, remark栏位将被更新为NULL值, 如果name, remark栏位不允许为null,则报错。 这不是我们希望看到的。

--when name, remark is not null, cause error. 
--if allow null, rows in TA not matched will be update to null.
update TA a set(name, remark)=(select b.name, b.remark from TB b where b.id=a.id);

可考虑的替代方法:

update TA a set name= nvl((select b.name from TB b where b.id=a.id), a.name);
update TA a set remark= nvl((select b.remark from TB b where b.id=a.id), a.remark);

如果TA.id, TB.id是unique index或primary key

可以使用视图更新的语法:

ALTER TABLE TA ADD CONSTRAINT TA_PK
  PRIMARY KEY (
  ID
)
 ENABLE
 VALIDATE
;

ALTER TABLE TB ADD CONSTRAINT TB_PK
  PRIMARY KEY (
  ID
)
 ENABLE
 VALIDATE
;

update (select a.name, b.name as newname, 
a.remark, b.remark as newremark from TA a, TB b where a.id=b.id)
set name=newname, remark=newremark;

更加详尽的对比分析参考下面的文章

ORACLE 多表关联 UPDATE 语句

PostgreSQL关联更新保姆级教程:别再写错SET和FROM了 本文详细解析了PostgreSQL关联更新的核心语法与常见错误,提供从基础到高级的实战案例,包括数据同步、条件性更新等场景。特别强调与MySQL/Oracle的语法差异,帮助开发者避免生产环境数据错乱,并分享性能优化与最佳实践。 阅读详情

相关推荐

FreeSqlSqlSugar在.NET Core环境下的性能对决:插入、批量操作与查询效率实测

本文详细对比了FreeSqlSqlSugar在.NET Core环境下的性能现,包括单条插入、批量操作和复杂查询效率。测试结果显示,SqlSugar在SQL Server下的批量插入和复杂查询中现更优,而FreeSql在多数据库支持和主键批量更新方面更具优势。文章还提供了实际项目选型建议,帮助开发者根据具体需求选择合适的ORM工具。

weixin_29230805的博客 31

通过SQL Server的Linked Servers连接到Oracle以直接更新相关数据

具体步骤如下。1.建立Linked Servers,如下图,在常规项下选择“其它数据源”下的Oracle,链接服务器及产品名称可任意填写,只是一个标志,最关键的地方是数据源一定要填正确 2.安全性选项卡下面如下设置,把用户名及密码写上,服务器选项默认就行。  3.假设在第一步的设置里“链接服务器名”里填入的是“TEST”,查询、写入、

Where there is a will there is a way 4837

S32K3 eMIOS使用介绍(PWM输出与输入捕获)——基于MCAL

本文基于 S32K3xx系列芯片、S32 Design Studio for S32 Platform开发平台以及EB tresos 28.0.0、 MCAL层,介绍pwm的输出及输入捕获。

HeFlyYoung的博客 2万+

SQL Server与Oracle链接服务器 实现数据同步

 在MSSQL中有个叫做链接服务器的功能(这个在Oracle里称为透明网关)。能把不同的异类数据库附加链接到MSSQL中,做为一个“虚库”(我给的名称)使用。比如Oracle,DB2,Sybase,access等等,基本上MS能提供驱动程序的都能做。  架好服务器,开通个Job,就实现了定时导数据的功能。  具体实现:    首先,在Oracle上创建View,给MsSql提供必要

软件开发大神 2109

SQL语句操作Oracle数据库——数据更新

数据库中的数据更新

ChinaYouxin的博客 6290

Oracle关联更新

Oracle关联更新

qq_38380338的博客 1万+

Oracle数据库】关联更新

根据执行结果可以看到a1里面有的而b1里面没有的直接更新null原因在更新的时候没有加更新的范围更新增加了更新的条件,那就是a1和b1都有相同的id那么就有select 1,那么exists就会返回true;最后进行更新操作exists的作用是检查子查询的结果是否为真,如果子查询为true则执行外面的SQL语句。exists不返回数据只返回true 或false如果需要同时更新多个字段,如下所示:UPDATE 1 t1。

yu_fu_a_bu的博客 1万+

oracle经典增删该查,oracle的基础增删改查总结

oracle的执行计划SQL> EXPLAIN PLAN FOR SELECT * FROM emp;已解释。SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));或者:SQL> select * from table(dbms_xplan.display);select disti...

weixin_28818643的博客 126

SQL应用:关联更新update (用一个更新另一个)

概述:用一个中的字段去更新另外一个中的字段。

qq_41961171的博客 3万+

Oracle数据库关联更新

MERGE INTO语法,主要用于在数据库中根据匹配条件更新数据适用于需要同时查询A和B才能确定更新数据的情况这条语句是一个SQL的MERGE语句,用于将TAB2中的数据合并到TAB1中。MERGE语句是一种非常强大的工具,它允许你根据一定的匹配条件来更新目标中的数据,或者在匹配失败时插入新的数据(虽然在这个特定的例子中并没有包含插入操作)。TAB1ATAB2BTAB1TAB2G_SGMT_IDTAB1TAB2REF_NOTAB1TRSC_DT'20241118'TAB1'测试'MERGE。

Hvitur的博客 1万+

oracle update 多关联更新

oracle关联更新 update t_water_livestock_breed_2020 t set t.type_identified = (select r.iteam_code from t_dict_dictionary_iteam r where t.type_identified = r.iteam_name and r.class_id = '1fce77fea4764357b15e3d2a40507857' ) where ex

JERRY_CHEN9999 1万+

oracle 关联更新的四种方法

关联更新更新数据来自另一张 update sys_menu a set SORT_NUM=(select b.SORT_NUM from sys_menu_temp b where b.NAME=a.NAME) where exists (select 1 from sys_menu_temp b where b.NAME=a.NAME ) ...

每天学习一点点 4万+

关联更新 oracle mssql

SET (字段一,字段二,...) = (select 字段一,字段二,... from DEMO_T2 T2 where T2.FNAME = T1.FNAME)参照T2,修改T1,修改条件为的name列内容一致。注意:需要取数据的,该字段必是主键或者有唯一约束。-没有where 不匹配的更新为空了。方式1:update。方式2:内联视图更新

jnrjian的博客 3518

Oracle - 关联更新三种方式

一.你需要准备? 创建如下数据 需求 二.解决方案 方式1,update 方式2:内联视图更新 方式3:merge更新

麦叔 3264

Oracle update 及以上关联更新,出现多值情况,不是一对一更新

Oracle update 及以上关联更新,出现多值情况,不是一对一更新

zhangzhongzhong的博客 1万+

ORACLE 关联更新常见实现方式

意图:有TST01{ID,NAME,AGE},TST02{ID,CNAME,CAGE}将TST01的字段NAME与TST02字段关联CNAME关联TST01的AGE更新到TST02的CAGE。 create table TST01 ( id VARCHAR2(64), name VARCHAR2(64),--此字段加上主键可以用内联视图方式更新,保证数据准确,如果不加主键,数据用MERGE方式更新数据会出错,见下方例子 age VARCHAR2(64) ); create .

u011731031的专栏 782

oracle update关联更新,oracle 关联的update操作

create table a(no number notnull,name varchar(10) notnull, locvarchar(10) notnull);create table b( no number notnull, name varchar(10) notnull, loc varchar(10) notnull);insert into a values(10, 'A...

weixin_42133415的博客 6210

ORACLE 关联更新三种方式

ORACLE 关联更新三种方式 不多说了,我们来做实验吧。 创建如下数据 select * from t1 ; select * from t2; 现需求:参照T2,修改T1,修改条件为的fname列内容一致。 方式1,update 常见陷阱: UPDATE T1 SET T1.FMONEY = (select T2.FMONEY from t2 where T2.FNAME = T1.FNAME) 执行后T1结果如下: 有一行原有值,被更新成空值了。

nie_sharp的博客 843

实战指南:Qwen3-ASR-1.7B 语音识别

本文介绍了Qwen3-ASR语音识别模型的安装与使用。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1713

python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)

python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行!python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的学生信息管理系统源码-GUI界面版+文档说明(高分项目)python实现的

上一篇: 寻找黑洞
下一篇: 自定义回发事件
Cassaba
博客等级 码龄22年 18粉丝 50原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值