以前只会写一些简单的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如下:
1
update
ZZ_TEST1 t1
set
t1.
"text"
= (
2
select
T2.
"text1"
from
ZZ_TEST2 t2
where
T2.
"pid"
=t1.
"id"
6
SELECT
1
FROM
ZZ_TEST2 t2
where
T2.
"pid"
=t1.
"id"
后面的where条件表示一个限制条件,只更新那些符合条件的数据,也可以写成
1
update
ZZ_TEST1 t1
set
t1.
"text"
= (
2
select
T2.
"text1"
from
ZZ_TEST2 t2
where
T2.
"pid"
=t1.
"id"
4
where
t1.
"id"
in
(
select
"pid"
from
ZZ_TEST2 )
参考文档:
http://ww.ciotimes.com/bi/oracle/64228.html
另外还有一种merge的写法,对应的sql如下:
1
merge
into
ZZ_TEST1 t1 using ZZ_TEST2 t2
on
(t1.
"id"
=t2.
"pid"
)
5
update
set
t1.
"text"
=t2.
"text1"
为了避免T2中有多条数据对应T1中的数据,可以把sql改成如下的方式:
1
MERGE
INTO
ZZ_TEST1 t1 USING
3
SELECT
*
FROM
ZZ_TEST2 X
WHERE
X. ROWID =
4
(
SELECT
MAX
(Y.ROWID)
FROM
ZZ_TEST2 Y
WHERE
X.
"id"
= Y.
"id"
)
7
ON
(t1.
"id"
= t2.
"pid"
)
9
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中使用。