现在我做一个统计查询的部分,需要遍历几个表,然后根据不同的条件进行统计最终结果,这样需要很长时间。请问用什么方法可以不用花费这么长时间???我的做法如下,觉得很笨。望指点一二,十分谢!
   //先删除统计数据表中的所有数据以便保证统计的正常进行
   with dm.candidateRect do
   begin
      close;
      sql.clear;
      sql.add('delete from EachCandidate');
      execsql;
   end;
   //开始统计结果
   with dm.ResultADO do
   begin
      close;
      sql.clear;
      sql.add('select * from candidateRect where image is null');
      open;
   end;
   if dm.ResultADO.RecordCount>0 then
   begin
      ProgressBar1.Max:=dm.ResultADO.RecordCount;
      dm.ResultADO.First;
      i:=0;
      while not dm.ResultADO.Eof do
      begin
         //取出模板中的相关信息
         CandidateGroupId:=dm.ResultADO.fieldbyname('CandidateGroupId').Value;//候选人组
         PaperId:=dm.ResultADO.fieldbyname('Paperid').value; //选票号
         halfId:=dm.ResultADO.fieldbyname('halfId').value;   //半票号
         AgreeRectId:=dm.ResultADO.fieldbyname('AgreeRectId').value;     //赞成意见框
         RejectRectId:=dm.ResultADO.fieldbyname('RejectRectid').value;   //反对意见框
         //根据模板中的相关信息去EachPaper表中寻找其每张选票中的选举意见框是否被选中
         //首先选择赞成意见框.
         with dm.Resultado1 do
         begin
            close;
            sql.clear;
            sql.add('select * from EachPaper where (paperid='+inttostr(paperid)+') and (halfid='+inttostr(halfid)+')  and (Rectid='+inttostr(AgreeRectId)+')'); //and (firstorsecond='+inttostr(firstorsecond)+')
            open;
         end;
         if dm.ResultADO1.RecordCount>0 then
         begin
            dm.ResultADO1.First;
            while not dm.ResultADO1.Eof do
            begin
               //根据前面的信息寻找反对意见框的信息
               BoxId:=dm.ResultADO1.fieldbyname('BoxId').value;
               SerialNum:=dm.ResultADO1.fieldbyname('PaperSerialnumber').value;
               with dm.ResultADO3 do
               begin
                  close;
                  sql.clear;
                  sql.add('select Marked from EachPaper where RectId='+inttostr(RejectRectId)+' and BoxId='+inttostr(BoxId)+' and PaperId='+inttostr(PaperId)+' and HalfId='+inttostr(halfId)+'  and PaperSerialnumber='+inttostr(Serialnum)+'');//and firstOrSecond='+inttostr(firstorsecond)+'
                  open;
               end;
               //将查询的结果插入表eachcandidate表中
               with dm.ResultADO2 do
               begin
                  dm.ResultADO2.Insert;
                  dm.ResultADO2.fieldbyname('CandidateId').Value :=dm.ResultADO.fieldbyname('candidateId').value;
                  dm.ResultADO2.FieldByName('CandidateGroupId').Value :=CandidateGroupID;
                  dm.ResultADO2.fieldbyname('SerialNum').Value :=dm.ResultADO1.fieldbyname('paperserialnumber').value;
                  dm.ResultADO2.fieldbyname('PaperId').Value :=PaperId;
                  dm.ResultADO2.fieldbyname('Boxid').value:=Boxid;
                  if (dm.ResultADO1.FieldByName('Marked').Value =1) and (dm.ResultADO3.fieldbyname('Marked').value=0) then
                     dm.ResultADO2.fieldbyname('AgreeIsed').Value :=1
                  else
                     dm.ResultADO2.fieldbyname('AgreeIsed').Value :=0;
                  if (dm.ResultADO3.FieldByName('Marked').Value =1) and (dm.ResultADO1.Fieldbyname('Marked').value=0) then
                     dm.ResultADO2.fieldbyname('RejectIsed').Value :=1
                  else
                     dm.ResultADO2.fieldbyname('RejectIsed').Value :=0;
                  if ((dm.ResultADO1.FieldByName('Marked').value=1) and (dm.ResultADO3.FieldByName('ed').value=1)) or ((dm.ResultADO1.FieldByName('Marked').value=0) and (dm.ResultADO3.FieldByName('ed').value=0)) then
                     dm.ResultADO2.FieldByName('AbortIsed').value:=1
                  else
                     dm.ResultADO2.Fieldbyname('AbortIsed').value:=0;
                  dm.ResultADO2.Post;
               end;
               dm.ResultADO1.Next;
            end;
         end;
      dm.ResultADO.Next;
      i:=i+1;
      ProgressBar1.Position :=i; //进度条进度显示
      end;
   end;
   showmessage('候选人与另选人选票信息统计完毕!');