现有三个表BZ  DAO   MARKS
数据库为ORACLEcreate table BZ(
    bz_number varchar2(20),   //bz号
    bz_name varchar2(20)      //bz名
);create table DAO(
    zkz varchar2(20),         //准考证
     //....其它字段
    bz_name varchar2(20)      //bz名
);create table MARKS(
    zkz varchar2(20),         //准考证
     //....其它字段
    bz_number varchar(20)     //bz名
);
现在由于MARKS表的数据是要导进来的, 但是导进来的数据没有bz_number这个字段, 所以我想用触发器在插入的时候, 通过zkz从DAO表获得bz_name的值,再从BZ表通过bz_name获得bz_number的值, 并更新到新插入MARKS的行表的结构动不了, 很纠结一开始我是想先批处理把数据全导入之后, 再用嵌套子查询来更新MARKS表, 不过MARKS表只有10000条记录就用了5分钟.
如果能给一个速度很快的sql通过BZ和DAO表来更新MARKS表中的bz_number字段也可以

解决方案 »

  1.   

    --导入数据后然后用下面语句更新
    --DAO表zkz,bz_name字段分别建立索引
    --BZ表bz_name建立索引
    UPDATE MARKS m
       SET m.bz_number =
           (SELECT b.bz_number
              FROM DAO d, BZ b
             WHERE d.bz_name = b.bz_name
               AND d.zkz = d.zkz)
      

  2.   


    BZ  30左右
    DAO  20000,  每年增长不会超过5000,  导入操作不会太频繁
    MARKS 每次导入的  应该有10000条
    谢谢tangren的回答
      

  3.   

    有个疑问,你的
    create table BZ(
        bz_number varchar2(20),   //bz号
        bz_name varchar2(20)      //bz名
    );
    里通过BZ_name去取bz_number ,不可以吧,例如两条记录的bz_number 不一样,但是bz_name一样,这时候你怎么取?除非bz_number和bz_name一一对应
      

  4.   


    因为那个数据库的数据不一致, 有的前面有0, 有的前面没0   就用lapd函数把where中的zkz处理了, 
    果然如果不用这个函数只需要一两秒钟