表T_1 表T_2
这两个表的特点是T_1的主键【ID】在T_2里并不是主键。
---------------------------------------------------------------
一、根据表T_1的name、sex列更新表T_2的name、sex列:
UPDATE (SELECT T1.NAME n1,
T2.NAME n2,
T1.SEX s1,
T2.SEX s2
FROM T_1 T1 INNER JOIN T_2 T2 ON T1.ID = T2.ID)
SET n2 = n1, s2 = s1;
二、根据表T_2的name、sex列更新表T_1的name、sex列:
UPDATE T_1 T1
SET (T1.NAME, T1.SEX) =
(SELECT NAME, SEX
FROM T_2 T2
WHERE T1.ID = T2.ID AND ROWNUM < 2)
WHERE EXISTS
(SELECT 1
FROM T_2 T2
WHERE T1.ID = T2.ID);
三、ORA-01779错误
Oracle中试图对一个子查询进行更新时可能会出现ORA-01779错误。该错误的内容为:
ORA-01779: cannot modify a column which maps to a non-key-preserved table
如果确定不会重复更新,可以加入注释:/*+ BYPASS_UJVC */
BYPASS_UJVC的作用是跳过Oracle的键检查。 这样虽然能够执行了,但是如果test2中存在不唯一的数据,test1就会被更新多次而导致意想不到的结果。
例如:
UPDATE (SELECT /*+ BYPASS_UJVC */
h.address a, r.regionname || b.bldname || c.cellname || h.showname b
FROM arc_houseinfo h
INNER JOIN arc_cellinfo c ON c.bldno = h.bldno AND c.cellno = h.cellno AND c.houseprop = h.houseprop
INNER JOIN arc_bldinfo b ON b.bldno = c.bldno
INNER JOIN arc_regioninfo r ON r.regionno = b.regionno
WHERE r.regionno = '03000916')
SET a = b;
注意:
以上方法不适用于11g,从11g开始不再支持该提示了。建议使用MERGE INTO;