今天碰到2张表 
1张 有字段 
表A有 
jtbh(家庭编号) hzxm(户主姓名) hnbh(户内最大编号)  
1000          张三            03 
1001          赵六.......................... 表B有 
grbh(个人编号=家庭编号+2位户内编号) xm(姓名) gz(工资) 
100001                          张三      1000 
100002                          李四      1000 
100003                          王五      1000 
2张表数据几十W。现在由于之前维护不好,表A的最大编号没有更新,例如表B 1001这户人有4个编号,100101,100102 ,100103,100105这样,但是我表A户内最大编号可能只到了04,而实际上要到05,请问各位大侠如何更新有效率,我自己写了个效率太低了。。

解决方案 »

  1.   

    楼上的,不是全覆盖,是要取出表B户内grbh(个人编号=家庭编号+2位户内编号) 户内编号的最大值update  a  set hnbh=(select max(substr(grbh,5,2)) from b where substr(grbh,1,4)=a.jtbh) 
    这是我自己写的,唉,没效率。
      

  2.   

    我写不出比你这个更有效的SQL了,不过用存储过程应该更快,毕竟检索次数少了很多。
      

  3.   

    没人会写个好点的存储过程吗?ORZ
      

  4.   

    试试我刚写的:
    CREATE PROCEDURE update_for_csdner();
      CURSOR v_cursor IS SELECT MAX(substr(grbh, 4, 2)) hnbh, substr(grbh, 0, 4) jtbh FROM b GROUP BY substr(grbh, 0, 4);
      v_jtbh VARCHAR2(4); 
      v_hnbh VARCHAR2(2);
    BEGIN
      OPEN v_cursor; 
      LOOP 
        FETCH v_cursor INTO v_hnbh, v_jtbh; 
        EXIT WHEN v_cursor%NOTFOUND; 
        UPDATE A SET hnbh = v_hnbh WHERE v_jtbh = v_jtbh; 
        COMMIT;
      END LOOP; 
      CLOSE v_cursor;
    END;
    不好用的话告诉我,我没有测试环境。
      

  5.   

    刚发完就发现自己把字段名写错了。。
    CREATE PROCEDURE update_for_csdner();
      CURSOR v_cursor IS SELECT MAX(substr(grbh, 4, 2)) hnbh, substr(grbh, 0, 4) jtbh FROM b GROUP BY substr(grbh, 0, 4);
      v_jtbh VARCHAR2(4); 
      v_hnbh VARCHAR2(2);
    BEGIN
      OPEN v_cursor; 
      LOOP 
        FETCH v_cursor INTO v_hnbh, v_jtbh; 
        EXIT WHEN v_cursor%NOTFOUND; 
        UPDATE A SET hnbh = v_hnbh WHERE jtbh = v_jtbh; 
        COMMIT;
      END LOOP; 
      CLOSE v_cursor;
    END;
      

  6.   

    试试这个,用Oracle的分析函数统计处表B中户内最大数update  a  set hnbh=(
       select bb.b_num from(  
          select substr(grbh,1,4) b_grbh,
              last(count())over(partition by substr(grbh,1,4)) b_num from b 
          ) bb
    )
    where a.jtbh=bb.b_grbh;