我有3个表分别是设备表(id,设备编号,设备名称),部门表(id,部门编号,部门名称),设备配发表(设备id,部门id),我想查询统计出如下结果:
             总公司  第一分公司 部门1 部门2 部门3  第二分公司 部门1 部门2所有设备       10       6         3     2    1        4        2     2
  a类设备       8       5         2     2    1        3        2     1
    计算机      3       1         1     0    0        1        1     0 
    打印机      3       1         1     0    0        1        0     1
    传真机      2       1         0     1    0        1        1     0 
    扫描仪      2       2         0     1    1        0        0     0
  b类设备       2       1         1     0    0        1        0     1
    空调        1       1         1     0    0        1        0     1
    电扇        1       0         0     0    0        0        0     0
      我现在是这么做的
1,把设备表的所有记录按编号顺序查询出来adoquery1
2,把部门表的所有记录按编号顺序查询出来adoquery2
3,嵌套循环
   adoquery2.First;
   for i:=1 to adoquery2.recordcount do
   begin 
     bmbh:= ADOQuery2.FieldValues['部门编号'];
     ADOQuery1.First ;
     While Not ADOQuery1.Eof Do
     Begin
       sbbh:= ADOQuery1.FieldValues['设备编号'];
       sqlstr:='select count(*) as 数量 from 设备表 as a,部门表 as b,设备配发表 as c where a.id=c.id and b.id=c.id and a.设备编号 like'''+sbbh+'%'+''''+' and b.部门编号 like'''+bmbh+'%'+''''
       with adoquery3 do
       begin
         close;
         sql.Clear;
         sql.Add(sqlstr);
         open;
       end; 
       得到数量
       Adoquery1.Next ;
     end; 
     Adoquery2.Next ; 
   end;
   这样做统计速度奇慢,有什么好办法可以加快统计速度吗?

解决方案 »

  1.   

    如果数据量不是太大的话,先取出数据,在前台用代码来处理,不用sql语句,也许会快些。
      

  2.   

    好像是一句话就能够实现吧
    select count(*) as 数量 from 设备配发表 as a 
    left join 部门表 b on a.部门id = b.id
    left join 设备表 c on a.设备id = c.id
    这句话我想就应该能够实现你的功能,试一下
      

  3.   

    上面的忘了一句话,呵呵
    select count(*) as 数量 from 设备配发表 as a 
    left join 部门表 b on a.部门id = b.id
    left join 设备表 c on a.设备id = c.id
    group by a.部门ID,a.设备ID
    你用了这么多的循环,而且还用到了like操作,速度当然慢的很
      

  4.   

    to vokeyliu(vokey) :
       您说的语句我试了一下,得到的结果不太对
      

  5.   

    select a.部门ID,a.设备ID,count(*) as 数量 from 设备配发表 as a 
    left join 部门表 b on a.部门id = b.id
    left join 设备表 c on a.设备id = c.id
    group by a.部门ID,a.设备ID,这样写,然后你检查一下哪里错了,基本思路就是这样的,
    语句也不一定非的这样写,只是提供一个思路,不要用这么多的循环
      

  6.   

    to vokeyliu(vokey) :
       您说的语句得到的结果是设备配发表中有记录的设备统计,而我想得到所有设备的的配发统计  
      

  7.   

    就用循环写,sql实现也要用循环的,实质差不多,可能sql效率会高些,但对sql熟练的也可以
      

  8.   

    应该考虑用sql完成你需要的功能再返回你需要的结果集,当然,sql语句搞不定,那只有先取出表的结果集再处理
      

  9.   

    有id 对应了,还用like 语句是什么意思,对你的陈述有点糊涂了
      

  10.   

    to 47522341(睡到8:30) :   没有配发设备的部门其数量为0。这就是一个难办的问题:3个表关联查询得到的都是有数量的,而没有的没什么好办法赋为零。
    to hare007(hare):
       由于部门编号和设备编号存在层次(树形结构),所以需要统计同级的数量之和,所以用到了like。
      

  11.   

    给你个思路,既然始终要遍历那么多数据,遍历数据库的速度一定会大大慢于遍历数组的速度,呵呵,不妨把抓出来的数据用数组记录,然后遍历。或者不要用ADOQuery1这样的方式,因为这样是实时查询遍历,用ClientDataSet在内存表里面遍历,也比你的快很多。