在Oracle数据库中同时更新两张表的简单方法
2015-11-21 00:00
585 查看
以前只会写一些简单的updaet语句,比如updae table set c1='XXX' 之类的
今天遇到一个数据订正的问题,项目背景如下,有个表A,有两个字段a1,a2还有一个关联表B,其中也有两个字段,b1和b2。其中a2和b2是关联的,想把A中的字段a1更新成B中的b1
理论上sql应该挺好写的,但是在oralce中实现了半天一直报语法错误。而且确实还有些小小细节没有注意到。
首先上测试数据
表1,ZZ_TEST1
表2,ZZ_TEST2
要把表一的text更新成表二的text1值,对应的sql如下:
update ZZ_TEST1 t1 set t1."text" = (
select T2."text1" from ZZ_TEST2 t2 where T2."pid"=t1."id"
)
WHERE EXISTS
(
SELECT 1 FROM ZZ_TEST2 t2 where T2."pid"=t1."id"
)
后面的where条件表示一个限制条件,只更新那些符合条件的数据,也可以写成
update ZZ_TEST1 t1 set t1."text" = (
select T2."text1" from ZZ_TEST2 t2 where T2."pid"=t1."id"
)
where t1."id" in (select "pid" from ZZ_TEST2 )
另外还有一种merge的写法,对应的sql如下:
merge into ZZ_TEST1 t1 using ZZ_TEST2 t2 on (t1."id" =t2."pid")
when matched then
update set t1."text"=t2."text1"
为了避免T2中有多条数据对应T1中的数据,可以把sql改成如下的方式:
MERGE INTO ZZ_TEST1 t1 USING
(
SELECT * FROM ZZ_TEST2 X WHERE X. ROWID =
(SELECT MAX(Y.ROWID) FROM ZZ_TEST2 Y WHERE X."id" = Y."id" )
)
t2
ON (t1."id" = t2."pid")
WHEN MATCHED THEN
UPDATE SET t1."text" = t2."text1"
还有一种update from 的语法,经过测试在oracle和mysql中不适用
总结一下,项目中尝尝需要把一张表的字段更新到另一张表中的某一个字段。可以使用update语法,并要做好限定。会使用merge的语法,另外还有一种merge的语法也可以,update from 不能再oracle和mysql中使用。
相关文章推荐
- linux下oracle客户端安装
- windows7_64下Oracle客户端及PL/SQL安装
- Oracle数据关联查询
- win10安装oracle 11g 时出现INS-13001环境不满足最低要求
- oracle用户创建及权限设置
- Oracle如何用户更改密码
- springmvc+mybatis+spring 整合 bootstrap html5 mysql oracle
- Oracle ORA-06502 数字或值错误:字符串缓冲区太小
- Oracle 删除表中记录 如何释放表及表空间大小
- oracle全备恢复后,再做0级增备恢复时的报错
- Oracle job及导入导出数据库
- oracle查询约束条件
- Oracle存在修改,不存在插入记录 SQL
- oracle 静默安装、删除实例
- ORACLE中DBMS_SQL的用法
- oracle中SET DEFINE意思
- ORACLE-SQL积累(查询外检约束、记录长度、字段长度、启用禁用触发器、case用法、分组连接函数、查询被锁表)
- Oracle查询表空间
- mybatis调用oracle存储过程
- Oracle (内连接)