日期:2014-05-17  浏览次数:20985 次

oracle 多表update
mt表(receipt,receipttext,messageid)
       -1           -1         1
       -1           -1         2
dr表(status,statustext,messageid)
       0           success      1
根据dr表中的内容,将status,statustext表中内容更新至mt表中的receipt,receipttext,条件messageid相同,(mt表中数据大于dr表中数据)

如上述数据执行update之后,mt表中内容更新为:
mt表(receipt,receipttext,messageid)
       0           success         1
       -1           -1         2

成功执行就给分
------解决方案--------------------
--try
update mt set (receipt,receipttext)=(select status,statustext from dr where mt.messageid=dr.messageid)
where exists(select * from dr where mt.messageid=dr.messageid); 
------解决方案--------------------
引用:
mt表(receipt,receipttext,messageid)
       -1           -1         1
       -1           -1         2
dr表(status,statustext,messageid)
       0           success      1
根据dr表中的内容,将sta……


其实,oracle对多表update有自己比较高效的处理方案

即:对视图的UPDATE语句

update (
          select /*+use_hash(mt,dr)*/ receipt,receipttext,status,statustext
          from mt,dr where mt.messageid=dr.messageid
       )
          set receipt=status,receipttext=statustext;


又或者、你可以用存储过程

          declare
            cursor c is select mt.*,mt.rowid from mt;
          begin
            for c1 in c
            loop
              update mt set (receipt,receipttext)=(select status,statustext from dr where mt.messageid=dr.messageid)
              where rowid=c1.rowid and exists (select 1 from dr where mt.messageid=dr.messageid);
            end loop;
          end;


这两种在效率上都比直接update好
你可以测