数据库中经常使用多表关联更新功能,但是三种数据库的多表关联更新语法差异较大,不注意会出现更新不成功,或者更新为错误数据。
oracle:
两表(多表)关联update -- 被修改值由另一个表运算而来
--
update tablea a -- 使用别名
set (c1,c2)=(select b.c1,b.c2
from tableb b
where b.id=a.id)
where exists (select 1
from tableb b
where b.id=a.id
);
注意如果不添加后面的exists语句,TA关联不到的行c1, c2栏位将被更新为NULL值, 如果c1, c2字段不允许为null,则报错。 这不是我们希望看到的。
oracle 还可以用 merge语法进行更新,关于merge多表更新的写法请扫描下方二维码码移步知识星球继续学习。
sqlserver:
update tablea set ca = b.ca,cb = b.cb
from tablea ta ,tableb tb
where a.id = b.id;
sqlserver的update后面是不能跟多表的,但需要跟在from子句后面;
mysql:
UPDATE tableA a
, tableB b SET a.a1 = b.b1 , a.a2 = b.b2 WHERE a.a3 = b.b3;
上面的例子都是两张表之间做关联,但是只更新一张表中的记录,其实是可以同时更新两张表的字段,即关联更新支持更新两个表的字段
UPDATE tablea a
INNER JOIN tableb b
ON a.Id = b.Id
SET a.price = a.price * 0.8,
b.dateUpdate = CURDATE()
WHERE b.dateCreated < '2004-01-01'
两张表做关联,更新了a表的price字段和b表字段的dateUpdate两个字段。
想学习更多,请扫描下方二维码,移步知识星球