Oracle中两表对比更新的两种方法

表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;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值