ORACLE UPDATE更新问题以及MERGE INTO的简单使用

问题

实习中,要求同步多表数据,使数据保持一致,首先就想到使用UPDATE,便有下面的SQL:

UPDATE  table_a a
SET (a.atr1,a.atr2,a.atr3)=(SELECT b.atr1,b.atr2,b.atr3
                            FROM table_b b
                            WHERE a.related_id=b.id

上面的SQL明显是错误的,因为当b中存在和a相关联的行时,确实会执行操作,使数据同步,但当b中没有和a相关联的行时,select的结果为null,但update也会修改数据,使a中的行修改为null。

应在update后加where exists条件:

UPDATE  table_a a
SET (a.atr1,a.atr2,a.atr3)=(SELECT b.atr1,b.atr2,b.atr3
                            FROM table_b b
                            WHERE a.related_id=b.id
WHERE EXISTS (SELECT 1
             FROM table_b b
             where a.related_id=b.id)

不加where 匹配条件,会将匹配不上的字段数据清空掉,加上后,将会避免这一状况。

ORACLE的MERGE INTO

上面的同步方法,需要用到exists检测,耗费大量的时间,于是乎,我接触到了ORACLE中merge into语法。

MERGE INTO table_a a
USING table_b b,
ON (a.related_id=b.id)
WHEN MATCHED THEN UPDATE SET (a.atr1,a.atr2,a.atr3)=(b.atr1,b.atr2,b.atr3)
WHEN NOT MATCHED THEN ...

这样一来,只有在a的数据和b中数据匹配时,才会进行修改,省去了exists的判断,效率大大提升

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值