Oracle update语句涉及多表关联时语法

在实际项目中经常会碰到一个表的数据update依赖其它表数据的情况。

方式一:update…set…where exists…

例如现在有两个表:客户表(customers)和vip客户表(cust_city)。

第一种情况:被update的值是固定的,仅在where条件句中有关联。

update customers a

set customer_type=’01’  –01为vip,00为普通

where exists (

    select 1 from cust_city b

    where b.customer_id = a.customer_id

)

第二种情况:被update的值由另一个表中的数据运算而来。

update一列的情况:

update customers a

set city_name=(select b.city_name from cust_city b where b.customer_id = a.customer_id)

where exists (

    select 1 from cust_city b

    where b.customer_id = a.customer_id

)

注意事项

上面的 where exists 的语句是不能省略的,否则会导致一些没有匹配的行会被更新成null值。

举个例子,有如下T1和T2两张表。

select * from T1;

select * from T2;

现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致。如果没有加 where exxits 语句,执行如下update语句。

UPDATE T1

SET T1.FMONEY = (select T2.FMONEY from T2 where T2.FNAME = T1.FNAME)

得到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);

验证更新后T1的数据:

方式二:merge into…when matched…

还是对于上面t1,t2两张表做联表更新,merge语句的使用方式如下:

merge into t1

using (select t2.fname,t2.fmoney from t2) t

on (t.fname = t1.fname)

when matched then

  update  set t1.fmoney = t.fmoney;

Oracle update语句涉及多表关联时语法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注