table1:40万数据,id,zhiwu,zhicheng……
table2:20万数据,这20万数据在table1中都可以查到,psn_id,aa,bb三个字段
现在我要把table2中的aa字段的数据更新到table1中的zhiwu上,bb字段的数据更新到zhicheng上,两个通过id和pan_id关联
update table1 t1 set (zhiwu,zhicheng)=(select t2.aa,t2.bb from table2 t2 where t2.psn_id=t1.id)
 where exists (select 1 from table2 t2 where t2.psn_id=t1.id) 
这样写语句应该没什么问题,但是执行起来很慢,几十分钟也没反应,索引也都建了,有没有更好的方法呢?

解决方案 »

  1.   

    建id和pan_id的唯一索引
    几十万数据不大,及时分钟没响应的话检查下是否表被锁住导致更新语句被挂起
    可以使用merge into
    merge into table1 a
    using table2 b
    on(a.id=b.psn_id)
    when matched then
    update set a.zhiwu=b.aa,a.zhicheng=b.bb;
      

  2.   

    锁的查询
    SELECT A.OWNER,
    A.OBJECT_NAME,
    B.XIDUSN,
    B.XIDSLOT,
    B.XIDSQN,
    B.SESSION_ID,
    B.ORACLE_USERNAME, 
    B.OS_USER_NAME,
    B.PROCESS, 
    B.LOCKED_MODE, 
    C.MACHINE,
    C.STATUS,
    C.SERVER,
    C.SID,
    C.SERIAL#,
    C.PROGRAM
    FROM ALL_OBJECTS A,
    V$LOCKED_OBJECT B,
    SYS.GV_$SESSION C 
    WHERE ( A.OBJECT_ID = B.OBJECT_ID )
    AND (B.PROCESS = C.PROCESS )
    ORDER BY 1,2 
      

  3.   

    用merge into怎么在update set update set a.zhiwu=b.aa,a.zhicheng=b.bb 这一行报错,missing keyword 
      

  4.   

    你用的数据库是9i的吧
    9i中merge into必须有when not matched部分
      

  5.   

    merge into bank_infor  b
    using aa  a  on(b.hr_psn_id=a.id)
    when matched then
    update   set b.zhiwu=a.a01035,b.zhicheng=a.a01074, 
    WHEN NOT MATCHED THEN 
    update  set b.hose_addr= '1';
    commit;
    这样写对不,在 when not matched then 这行报错 missing equal sign
      

  6.   

    9i中
    WHEN NOT MATCHED THEN 后必须是 insert values(....)
      

  7.   


    MERGE INTO table1 a
    USING table2 b
    ON (a.id = b.psn_id)
    WHEN MATCHED THEN
      UPDATE SET a.zhiwu = b.aa, a.zhicheng = b.bb
    WHEN NOT MATCHED THEN
      INSERT VALUES (b.psn_id, b.aa, b.bb);
    --如果b表有不匹配的ID则要被插入A表