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的判断,效率大大提升

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