很长时间没有用Oracle了,突然用的时候遇到一个问题,就很棘手阿。不过幸好有高手指点,不过并没有说明原因,后来在网上一查才知道原来是这么回事。
以前一般的语法是
update A a set (a.mandt, a.bukrs)=(select b.mandt, b.bukrs from B b
where a.zzid=b.zzid)
这种语法对于如果mandt或者bukrs不是主键的来说是没有问题,因为以上语法是将表A中mandt, bukrs列的值全部更新, 更新的值为:select b.mandt, b.bukrs from B b where a.zzid=b.zzid (没有对应上的更新为null.)
所以对于不允许为NULL的,语法需要修改成
update A a set (a.mandt, a.bukrs)=(select b.mandt, b.bukrs from B b
where a.zzid=b.zzid) where exist (select 1 from B b where b.zzid = a.zzid)
这样就防止了出现空的情况。