Oracle:多表关联更新字段(update)

Oracle可以用以下两种方式实现多表关联更新字段:

update (
  select t1.name name1, t2.name name2
  from table1 t1
    left join table2 t2 on t1.id = t2.id
  where t1.age > 20
) tmp
set tmp.name1 = tmp.name2;

这样更新若报如下错误:无法修改与非键值保存表对应的列。

其原因为:

table2表的关联列,也就是t2.id列不是主键。若其为非唯一的,一个id能查出多个name来,oracle就无法确定更新为哪个name。

此时可以使用下面的语句更新:

UPDATE table1 t1 
SET t1.name = (SELECT t2.name
               FROM table2 t2
               WHERE t1.id = t2.id)
WHERE t1.age > 20
AND EXISTS (SELECT t2.name
            FROM table2 t2
            WHERE t1.id = t2.id);

这个语句能正确执行,要求待更新的每一条table1数据,其对应的子句:

SELECT t2.name FROM table2 t2 WHERE t1.id = t2.id

其查询结果唯一。

若非如此,会报错:单行子查询返回多个结果。

这时候可以采用返回为唯一的子句进行更新,如:

UPDATE table1 t1 
SET t1.name = (SELECT max(t2.name)
               FROM table2 t2
               WHERE t1.id = t2.id)
WHERE t1.age > 20
AND EXISTS (SELECT t2.name
            FROM table2 t2
            WHERE t1.id = t2.id);

这种更新语句是一个事务,所以最好不要一次更新太多数据,造成性能下降。

你可能感兴趣的:(数据库)