问题
实习中,要求同步多表数据,使数据保持一致,首先就想到使用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的判断,效率大大提升