救急,请高手指点一下。谢谢
 dataset dst中有selecttable表有行数据,进退货表,销售管理表,库存变动表,商品调拨表里有行数据(主要每个编码查询这表花时间),查询selecttable表中每个编码在其他个表中相同编码的数量。下面的做法查询selecttable表中行就要分钟,效率太低。请问该怎么优化?谢谢
for (int i = 0; i < selecttable.Rows.Count; i++)
{
   DataRow row = selecttable.Rows[i];
   object ret1, ret2;
   if (dst.Tables["进退货"].Rows.Count > 0)
   {
       liename = "尺码" + row[7];
       ret1 = dst.Tables["进退货"].Compute("sum(" + liename + ")", "编码='" + row[0] + "' and 数量>0 and 日期>'" + date2 + "'");
       num1 = (DBNull.Value == ret1 ? 0 : Convert.ToInt32(ret1));
       ret2 = dst.Tables["进退货"].Compute("sum(" + liename + ")", "编码='" + row[0] + "' and 数量>0 and 日期>='" + date1 + "' and 日期<='" + date2 + "'");
       num11 = (DBNull.Value == ret2 ? 0 : Convert.ToInt32(ret2));
       ret1 = dst.Tables["进退货"].Compute("sum(" + liename + ")", "编码='" + row[0] + "' and 数量<0 and 日期>'" + date2 + "'");
       ret2 = dst.Tables["进退货"].Compute("sum(" + liename + ")", "编码='" + row[0] + "' and 数量<0 and 日期>='" + date1 + "' and 日期<='" + date2 + "'");
       num5 = (DBNull.Value == ret1 ? 0 : Convert.ToInt32(ret1));
       num55 = (DBNull.Value == ret2 ? 0 : Convert.ToInt32(ret2));
   }
 if (dst.Tables["商品调拨"].Rows.Count > 0)
   {
       ret1 = dst.Tables["商品调拨"].Compute("sum(调拨数量)", "编码='" + row[0] + "' and 调拨部门='" + bumen + "' and 调拨时间>'" + date2 + "'");
       ret2 = dst.Tables["商品调拨"].Compute("sum(调拨数量)", "编码='" + row[0] + "' and 调拨部门='" + bumen + "' and 调拨时间>='" + date1 + "' and 调拨时间<='" + date2 + "'");
       num4 = (DBNull.Value == ret1 ? 0 : Convert.ToInt32(ret1));
       num44 = (DBNull.Value == ret2 ? 0 : Convert.ToInt32(ret2));
       ret1 = dst.Tables["商品调拨"].Compute("sum(调拨数量)", "编码='" + row[0] + "' and 所属部门='" + bumen + "' and 调拨时间>'" + date2 + "'");
       ret2 = dst.Tables["商品调拨"].Compute("sum(调拨数量)", "编码='" + row[0] + "' and 所属部门='" + bumen + "' and 调拨时间>='" + date1 + "' and 调拨时间<='" + date2 + "'");
       num8 = (DBNull.Value == ret1 ? 0 : Convert.ToInt32(ret1));
       num88 = (DBNull.Value == ret2 ? 0 : Convert.ToInt32(ret2));
   }

解决方案 »

  1.   

    这个应该可以直接用SQL查询出来的,请把表结构发出来一下呗!这样速度就很快了
      

  2.   

    selecttable表结构
    编码 颜色 尺码1 尺码2 尺码3
    111 红色  5   5   5
    111 白色  3   4   6进退货表结构
    编码 颜色 尺码 数量 日期
    111 红色 尺码1 3  2009-10-09
    111 红色 尺码2 5  2009-10-09
    111 白色 尺码1 3  2009-10-09商品调拨表结构
    编码 颜色 尺码 数量 日期
    111 红色 尺码1 3  2009-10-09
    111 红色 尺码2 5  2009-10-09
    111 白色 尺码1 3  2009-10-09要查询selecttable表中111红色尺码1,111红色尺码2,111白色尺码1,111白色尺码2 一段时间 分别在进退货表,商品调拨表中的数量,各数量查询结果再装入一个统计表中该怎么操作呀?
      

  3.   

    --看到表结构了,不知道你是什么数据库使用SQL SERVER写的。
    -- “各数量查询结果再装入一个统计表中该怎么操作呀?”不知道你要的是不是合计表,所以我把他
    --们用UNION ALL连起来了,并且做了一个合计,如果不是这个意思的话,在给你修改下。
    --下面是SQL语句SELECT 编码,颜色,尺码,SUM(数量) AS 数量 FROM 进退货表结构 WHERE 日期>='2009-10-9' and 日期<='2009-10-9' GROUP BY 编码,颜色,尺码,日期
    UNION ALL
    SELECT null,'进退货表合计','',SUM(数量) AS 数量 FROM 进退货表结构 WHERE 日期>='2009-10-9' and 日期<='2009-10-9' GROUP BY 日期
    UNION ALL
    SELECT 编码,颜色,尺码,SUM(数量) AS 数量 FROM 商品调拨表结构 WHERE 日期>='2009-10-9' and 日期<='2009-10-9' GROUP BY 编码,颜色,尺码,日期
    UNION ALL
    SELECT null,'商品调拨表合计','',SUM(数量) AS 数量 FROM 商品调拨表结构 WHERE 日期>='2009-10-9' and 日期<='2009-10-9' GROUP BY 日期
    ---我查询的结果
    编码     颜色         尺码         数量
    111 白色     尺码1 3
    111 红色     尺码1 3
    111 红色     尺码2 5
    NULL 进退货表合计 11
    111 白色     尺码1 3
    111 红色     尺码1 3
    111 红色     尺码2 5
    NULL 商品调拨表合计 11
      

  4.   

    上面曲解我意思了。
    要先查询出selecttable表中数据,
    111红色尺码1,111红色尺码2,111红色尺码3,111红色尺码4。(查尺码1,尺码2,尺码3的数量)
    111白色尺码1,111白色尺码2,111白色尺码3,111白色尺码4。(selecttable表第二行查尺码1,尺码2,尺码3的数量)上面selecttable表中2行就需要查询8个结果
    然后这8个结果再循环查询分别在进退货表,商品调拨表中的数量,各数量查询结果再装入一个统计表中该怎么操作呀?
    期初=selecttable表数量+商品调拨数量-进退货数量
    期末=selecttable表数量
    统计表
    编码  颜色  尺码  期初  进退货  商品调拨 期末
    111  红色  尺码1  2    3     4    1
    111  红色  尺码2  2    3     4    1
    111  红色  尺码3  2    3     4    1
    111  红色  尺码4  2    3     4    1
    111  白色  尺码1  2    3     4    1
    111  白色  尺码2  2    3     4    1
    111  白色  尺码3  2    3     4    1
    111  白色  尺码4  2    3     4    1
    这是selecttable表中2行得的结果