A表和B表主键都是pk1,pk2,现在我要更新B表,规则:将B表中和A表主键相同的记录更新到A表。我写的是:
UPDATE A T1 SET 
   (T1.FIELD1,
    T1.FILED2
   ) = (SELECT T2.FILED1,
               T2.FILED2
        FROM B T2 WHERE T1.PK1 = T2.PK1 AND T1.PK2 = T2.PK2
       )
WHERE EXISTS (SELECT 1 FROM A T3 , B T4 WHERE T3.PK1 = T4.PK1 AND T3.PK2 = T4.PK2)
我知道写的有点累赘,刚开始我也怀疑是不是可以去掉外面的where条件,可是当我去掉后再执行时,结果就会出现cant update TI.field2 to null的错误,所以我怀疑可能是因为A 表原有的记录比查出来要更新的记录集多,不加外层where时,去匹配更新记录时会将其余不需要更新的记录更新成默认的NULL,而A.field2为非空,所以才会出现这样的错误?不知道分析得有无道理?请大虾们写出正确的sql来参考参考吧,

解决方案 »

  1.   

    杩欎釜灏辨槸瀵圭殑.褰撴病鏈墂hERE鐨勬椂鍊?閫愭潯鎵弿A琛?鏄庢樉鐨勫綋B涓病鏈夊拰A鍖归厤鐨勮褰曠殑鏃跺€?SELECT 璇彞杩斿洖NULL.
      

  2.   

    update A t1
    set 
    t1.Field1=nvl( (select t2.Field1 from B t2
    where t1.pk1=t2.pk1
    and t1.pk2=t2.pk2),t1.field3);搂主的写法 在sqlserver里好像见过
    oracle 不清楚
      

  3.   

    http://www.5inet.net/Database/ORACLE/071645.html
      

  4.   

    貌似这种写法,里面的SELECT只能返回单条记录。
    等着达人看有没有办法。
      

  5.   

    按照syuku() 提供的地址,用下面这个格式去套,就可以了。我也是菜鸟,跟着学习
       -- update 超过2个值
       update customers a   -- 使用别名
       set    (city_name,customer_type)=(select b.city_name,b.customer_type 
                                         from   tmp_cust_city b 
                                         where  b.customer_id=a.customer_id)
       where  exists (select 1 
                      from   tmp_cust_city b
                      where  b.customer_id=a.customer_id
                     )
      

  6.   

    觉得icefirelxb(icefire) 说的
    "这种写法要SELECT只能返回单条记录"
    是正解