综合叙述:遍历A表,根据SN号码去查找B表,如何这个SN号码的记录存在就把这条记录的3个字段的值取出来,联合A表中的几个字段的值,最后写入C表。delphi代码如下:
//先把adoquery1和A表关联起来
 with adoquery1 do
    begin
      if active=true then close;
      SQL.Clear;
      tempsql:='select * from tempinfordone';
      sql.Add(tempsql);
      prepared:=true;
      open;
    end;    adoquery1.first; //A表指针从0开始    with adoquery2 do
      begin
        while not(adoquery1.Eof) do
          begin
            if active=true then close;
            SQL.Clear;
            //所有字段准备
            tempsn:=adoquery1.fieldbyname('SN').AsString;
            tempMobileType:=adoquery1.fieldbyname('MobileType').AsString;
            tempMalCode:=adoquery1.fieldbyname('MalCode').AsString;
            tempwhereis:=adoquery1.fieldbyname('whereIs').AsString;
            tempAnalyst:=adoquery1.fieldbyname('Analyst').AsString;
            tempState:=adoquery1.fieldbyname('State').AsString;
            tempcurrentPos:=adoquery1.fieldbyname('currentPos').AsString;
            tempdt:=adoquery1.fieldbyname('InforDT').AsString;
            tempnumber:=adoquery1.fieldbyname('Number').AsString;            //sql语言 查询B表中是否存在这个SN号码的记录
            tempsql:='select * from MaintainLog where sn=:p1';
            sql.Add(tempsql);
            Parameters[0].Value:=tempsn;
            open;
            if recordcount=1 then  //如何存在就把A中几个字段和B中的几个字段写到C表中
              begin
                tempmaiwhys:=fieldbyname('MaiWhys').AsString;
                temploc:=fieldbyname('MalLoc').AsString;
                tempcause:=fieldbyname('Cause').AsString;
                with adoquery3 do
                  begin
                    if active=true then Close;
                    SQL.Clear;
                    tempsql:='select * from QueryUseNoDelete';
                    SQL.add(tempsql);
                    Prepared:=true;
                    open;
                    Append;
                    fieldbyname('SN').Value:=tempsn;
                    fieldbyname('MobileType').Value:=tempMobileType;
                    fieldbyname('MalCode').Value:=tempMalCode;
                    fieldbyname('whereIs').Value:=tempwhereis;
                    fieldbyname('Analyst').Value:=tempAnalyst;
                    fieldbyname('State').Value:=tempState;
                    fieldbyname('currentPos').Value:=tempcurrentPos;
                    fieldbyname('dt').Value:=tempdt;
                    fieldbyname('Number').Value:=tempnumber;
                    fieldbyname('MaiWhys').Value:=tempmaiwhys;
                    fieldbyname('MalLoc').Value:=temploc;
                    fieldbyname('Cause').Value:=tempcause;
                    post;
                  end;
              end;
             if recordcount=0 then  //如果没有匹配记录就写3个字段是“无分析记录”
                 begin
                    tempmaiwhys:='无分析记录';
                    temploc:='无分析记录';
                    tempcause:='无分析记录';
                    with adoquery3 do
                     begin
                       if active=true then Close;
                       SQL.Clear;
                       tempsql:='select * from QueryUseNoDelete';
                       SQL.add(tempsql);
                       Prepared:=true;
                       open;
                       Append;
                       fieldbyname('SN').Value:=tempsn;
                       fieldbyname('MobileType').Value:=tempMobileType;
                       fieldbyname('MalCode').Value:=tempMalCode;
                       fieldbyname('whereIs').Value:=tempwhereis;
                       fieldbyname('Analyst').Value:=tempAnalyst;
                       fieldbyname('State').Value:=tempState;
                       fieldbyname('currentPos').Value:=tempcurrentPos;
                       fieldbyname('dt').Value:=tempdt;
                       fieldbyname('Number').Value:=tempnumber;
                       fieldbyname('MaiWhys').Value:=tempmaiwhys;
                       fieldbyname('MalLoc').Value:=temploc;
                       fieldbyname('Cause').Value:=tempcause;
                       post;
                    end;
                 end;
            adoquery1.next; //指针后移
          end;
      end;//===================================
问题提出:如果A表数据量比较多,500条以上就会出现程序假死的现象,请问该如何解决呢?
如果服务器端写SQL存储过程,该如何写,我是SQL初手。请大家帮忙啊!!!

解决方案 »

  1.   

    干吗用delphi写,直接在sql里完成。        字段名  数值1 数值2 数值3
    tableA  A1     x     ax     uui
            A2     y     f      cc
            A3      z    f      sstableB  B1     x    aa      aab
            B2     zz   cc     cda
            B3     tt   dd      ddselect A.a1,a.a2,a.a3,b.b1,b.b2,b.b3 from tableA a,TableB b where b.b1=a.a1 
    结果
    A1 a2 a3 b1 b2 b3
    x  y  z  x  zz  tt插入C
    insert into c (a1,a2,a3,b2,b3) select A.a1,a.a2,a.a3,b.b2,b.b3 from tableA a,TableB b where b.b1=a.a1 
      

  2.   

    这种数据处理的勾当一定要让SQL Server去做,delphi写要累死的
      

  3.   

    如果一定要用Delphi写,注意以下两个方面:1. 打开C表的语句要放在循环的外面,否则插入一条记录都要打开一遍C表,对程序的效率的影响也很大。
    2. 打开B表的语句也放在循环的外面,不用where语句(即打开完整的B表),记录的查找用Locate方法,这样也可以提高执行效率。但是这种情况下,用SQL语句是最有效率的,缺点是你无法控制显示处理进度,而且在大数据量的情况下,要注意TADOQuery的timeout要设置的高一点以保证SQL语句能够正常完成。
      

  4.   

    同一楼上观点!最好用sql写!
      

  5.   

    tempsql:='select * from tempinfordone'
    =============================================
    这种打开表的方法,数据量大时肯定造成假死机的,
    打开表的条件一定要有的
      

  6.   

    tempsql:='select * from tempinfordone'
    =============================================
    这种打开表的方法,数据量大时肯定造成假死机的,
    打开表的条件一定要有的===============================
    是不是空结果查询条件也可以啊?好比where sn='000000000000'这个SN没有。
      

  7.   

    像你这种完全可以用sql语句来完成,干嘛这么费劲
      

  8.   

    insert into C(各字段)
    select 各字段 from A, B
    where A.SN=B.SN
    and A.SN not in 
      (SELECT SN FROM C)