FNAME | FMONEY |
---|---|
A | 20 |
B | 20 |
FNAME | FMONEY |
---|---|
C | 10 |
D | 20 |
A | 100 |
需求:参照T2表,更新T1表 FMONEY 列的内容,两表关联字段为 FNAME。
方法一:直接update
常见错误
UPDATE T1
SET T1.FMONEY = (select T2.FMONEY from T2 where T2.FNAME = T1.FNAME)
执行结果:可以看到,T2 表中没有而T1 表中存在的 “FNAME列的B” ,被错误修改为null。
上述sql语句错误在于,没有限定更新范围,因此是对 T1表 全表进行更新。
正确写法
UPDATE T1
SET T1.FMONEY = (select T2.FMONEY from T2 where T2.FNAME = T1.FNAME)
WHERE EXISTS(SELECT 1 FROM T2 WHERE T2.FNAME = T1.FNAME);
如果需要同时更新多个字段,如下所示:
UPDATE 表1 t1
SET (字段一,字段二,…) = (select 字段一,字段二,… from 表2 t2 where t2.关联字段 = t1.关联字段)
WHERE EXISTS(SELECT 1 FROM 表2 t2 WHERE t2.关联字段 = t1.关联字段);
方法二:内联视图更新
UPDATE
(select t1.fmoney fmoney1,t2.fmoney fmoney2 from t1,t2 where t1.fname = t2.fname
)t
set fmoney1 =fmoney2;
方法三:merge更新
merge into t1
using t2
on (t2.fname = t1.fname)
when matched then
update set t1.fmoney = t2.fmoney;