服务器之家

服务器之家 > 正文

在Oracle数据库中同时更新两张表的简单方法

时间:2019-12-23 15:50     来源/作者:王小明123

以前只会写一些简单的updaet语句,比如updae table set c1='XXX' 之类的

今天遇到一个数据订正的问题,项目背景如下,有个表A,有两个字段a1,a2还有一个关联表B,其中也有两个字段,b1和b2。其中a2和b2是关联的,想把A中的字段a1更新成B中的b1

理论上sql应该挺好写的,但是在oralce中实现了半天一直报语法错误。而且确实还有些小小细节没有注意到。

首先上测试数据

表1,ZZ_TEST1

Oracle,数据库,更新表

表2,ZZ_TEST2

Oracle,数据库,更新表

要把表一的text更新成表二的text1值,对应的sql如下:

?
1
2
3
4
5
6
7
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条件表示一个限制条件,只更新那些符合条件的数据,也可以写成

?
1
2
3
4
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如下:

?
1
2
3
4
5
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改成如下的方式:

?
1
2
3
4
5
6
7
8
9
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中使用。

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
配置IIS网站web服务器的安全策略配置解决方案
配置IIS网站web服务器的安全策略配置解决方案 2019-05-23
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
Nginx服务器究竟是怎么执行PHP项目
Nginx服务器究竟是怎么执行PHP项目 2019-05-24
返回顶部