A表学号                                   
---------------------------------
0001                                 
0002       
0003      
0004                                 
0005                                
0006                     
0007
0009
0010
0013
0016
0019
0021
0022
0024
0026
0027
0028
0029
0030
0031
0032
0033
0036
0039
0038
0042B表
学号范围
------------------
0001~0015
0019~0029
0040~0050
现在需要找到A表中不存这三个范围内的学号并将其列出来。例如第一个范围内不存在的学号是:0011,0012,0014 第二个范围不存在的是20,23,25。现求怎么实现。谢谢

解决方案 »

  1.   

    用procedure写的,凑合用一下:
    create or replace procedure find_number as
     v_beg varchar2(10);
     v_end varchar2(10);
     i number;
     j number;
     v_a_number varchar2(10); cursor c1 is select * from b;
    begin
      for c in c1 loop
        v_beg:=substr(c.学号范围,1,instr(c.学号范围,'~')-1);
        v_end:=substr(c.学号范围,instr(c.学号范围,'~')+1);    for i in to_number(v_beg)..to_number(v_end) loop
          v_a_number:=lpad(i,4,'0');      select count(*) into j from a
          where 学号=v_a_number;       if j=0 then
            dbms_output.put_line('the number '||v_a_number||' in range '||v_beg||' '||v_end||' does not exists');
           end if;
        end loop;
      end loop
    end;
    /
      

  2.   

    嗯谢谢,不过我的A表中有40几W条的数据B表的范围也达到近20w 用这种方式,性能上很低。有没有更好的方法。
      

  3.   

    我不知道你的机器是什么级别的,反正在我这里40W和20W不算是很大的数量,
    首先你可以对A表的学号建个索引,其次,对B表你可以分批倒入,然后分批
    执行存储过程。