Oracle:同步两张表的相同字段

有一个需求需要同步两张表的相同字段,比如表A和表B,这两张表是不同的用户下的表,表结构是一样的。

一开始我简单写了一个sql语句,如下:

update ord_log1 A
    set 
        (A.pid, A.beg_ticket_no, A.end_ticket_no) = 
        (select B.pid, B.beg_ticket_no, B.end_ticket_no
            from 
                newhl.ord_log B
            where
                A.mer_id = B.mer_id 
            and 
                A.ord_id = B.ord_id)
    where
             A.acct_date between '20190507' and '20190508');
commit;

运行一下,报错,ORA-01407:无法更新字段pid为NULL,想了一下,估计是表B中pid有NULL的值,而A表pid确实不能为NULL,于是加上条件B.pid is not null。运行一下,还是报同样的错,那就有点奇怪了。查看一下表B所有的pid的值,没有为NULL的啊,那是怎么回事。

找了很久,原来是外层的where条件符合的数据范围(X条记录)多余内层where的条件(Y条记录),这些超过的记录都会自动设置为NULL,所以一直报无法更新字段pid为NULL的错误。(参考http://blog.itpub.net/28602568/viewspace-2076239/)于是新的sql语句修改如下:

update ord_log1 A
    set 
        (A.pid, A.beg_ticket_no, A.end_ticket_no) = 
        (select B.pid, B.beg_ticket_no, B.end_ticket_no
            from 
                newhl.ord_log B
            where
                A.mer_id = B.mer_id 
            and 
                A.ord_id = B.ord_id
            and 
                A.acct_date between '20190424' and '20190512')
    where
        exists
            (select B.pid, B.beg_ticket_no, B.end_ticket_no
                from 
                    newhl.ord_log B
                where
                    A.mer_id = B.mer_id 
                and 
                    A.ord_id = B.ord_id
                and 
                    A.acct_date between '20190424' and '20190512');

        

运行,可以了。还是平时写sql语句比较少,没有什么经验啊。

转载于:https://www.cnblogs.com/fxl-njfu/p/10844408.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值