方式一:
UPDATE TA a
   SET m1 = (SELECT k1 FROM TB b WHERE a.id = b.id),
       m2 = (SELECT k2 FROM TB b WHERE a.id = b.id),
       m3 = (SELECT k3 FROM TB b WHERE a.id = b.id),
       m4 = (SELECT k4 FROM TB b WHERE a.id = b.id);方式二:
for cur_value in (select id,k1,k2,k3 from TB )
loop
   updte TA
   set m1 = cur_value.k1,
       m1 = cur_value.k1,
       m1 = cur_value.k1,
       m1 = cur_value.k1
   where TA.id = cur_value.id;
end loop;

解决方案 »

  1.   

    我觉得这个问题不能很简单的说哪个执行的速度更快,原因如下:第一段SQL在内部会去循环Ta表,然后再去做连接,(连接中实际上也会再去做循环)第二段SQL有两层循环,第一层是Tb表,第二层是Ta表所以说两者执行的速度,与两张表的大小,与是否有关键字索引,有很直接的关系,比方说:Ta有10条数据,Tb有10,000条数据,并且两者在id上都建有索引。这种情况下,很明显是第一种的速度快。又比方说,Ta有10,000条数据,Tb有10条数据,并且两者都没有有索引。那么,这个时候就是第二种的速度快了。
      

  2.   

    哪个都不高:UPDATE TA a
    SET (m1,m2,m3,m4) =select k1,k2,k3,k4 from b where a.id=b.id;
      

  3.   

    都不好,应采用如下形式:
    UPDATE TA a
       SET (m1, m2, m3, m4) = (select k1, k2, k3, k4 from TB where id=a.id)
      

  4.   

    应该加上条件,否则TB中不存在的记录m1, m2, m3, m4都会变为null
    UPDATE TA a
       SET (m1, m2, m3, m4) = (select k1, k2, k3, k4 from TB where id=a.id)
    WHERE EXISTS (SELECT * from TB where id  = a.id)
      

  5.   

    楼上正解。如果不考虑(m1, m2, m3, m4) 空记录情况,
    UPDATE TA a
       SET (m1, m2, m3, m4) = (select k1, k2, k3, k4 from TB where id=a.id)
    这个正解。