ORALCE如何update两个表的数据

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

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

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

首先上测试数据 oracle

表1,ZZ_TEST1 测试

表2,ZZ_TEST2 spa

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


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 )

参考文档: htm

http://ww.ciotimes.com/bi/oracle/64228.html ci

另外还有一种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中不适用

其语法规则以下:

http://www.frogjumpjump.com/2011/09/sql-update-from.html


总结一下,项目中尝尝须要把一张表的字段更新到另外一张表中的某一个字段。能够使用update语法,并要作好限定。会使用merge的语法,另外还有一种merge的语法也能够,update from 不能再oracle和mysql中使用。

相关文章
相关标签/搜索