首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么优化这段查询代码

2012-01-28 
如何优化这段查询代码winform程序有三张表,简单说明如下(Access数据库)表A(机器)字段:id区域表B(区域)字段

如何优化这段查询代码
winform程序
有三张表,简单说明如下(Access数据库)
表A(机器)
字段:   id     区域
表B(区域)
字段:id     性质
表C(负责人)
字段:id     名称
实际上的情况要比这个复杂一点,为了说明问题我简化了一下
每个表的id字段都是各自的主键,我需要做的是在datagridview中将机器id,所属区域,所属区域的负责人显示出来,如果仅仅是这样就好办了,比较麻烦的是表A中的机器可能不属于任何区域(此时区域字段用0填充),也可能属于好几个区域(用,隔开区域id,比如1,2,3),而表B中区域字段可能是空的或者是表c中id字段中的一个值(只有一个)

表A
id       区域
1           0
2           1,2
3           3
4           1,3

表B
id       性质
1           1
2           2
3          

表C
id         负责人
1             张三
2             李四

显示如下
        id         所属区域         负责人
        1               0                     无
        2             1,2               张三,李四
        3               3                 该区域未指定负责人
        4             1,3             张三,该区域未指定负责人

我原来的查询方式是遍历表A,如果其所属区域为0则设置变量值为“无”,否则用变量记录所属区域的值,然后用split分开,分别查询该区域id在表b中对应的性质,如果性质为空则设置变量为“该区域未指定负责人”,将所属的每个区域的负责人名称组合到变量中

sql语句如下(程序中字段名为英文,此处为了说明方便写成中文)
  sqlQuery   =   "select   id   ,区域   from   表A ";
  ds   =   DataAccess.GetDataSet(sqlQuery,   "表A ");
  for   (int   dscount   =   0;   dscount   <   ds.Tables[0].Rows.Count;   dscount++)
{
      str   =   " ";
if   (ds.Tables[0].Rows[dscount][1].ToString()   !=   "0 ")//该机器有所属区域
{
          idarea   =   ds.Tables[0].Rows[dscount][1].ToString().Split( ', ');
                    for   (int   i   =   0;   i   <   idarea   .Length;   i++)
                        {
                          sql   =   "select   id   from   表B   where   id= "   +   idarea   [i]   +   " ";
                                if   (DataAccess.QueryData(sql)   !=   " ")//该区域有负责人
                                {
                                sql   =   "select   负责人   from   表C   where   id   =(select   性质   from   表B   where   id= "   +   idarea   [i]   +   ") ";
                                ds2   =   DataAccess.GetDataSet(sql,   "表B ",   "表C ");


                                if   (ds2.Tables[0].Rows.Count   >   0)
                                {
                                  gname   =   ds2.Tables[0].Rows[0][0].ToString();//区域对应的负责人
                                      if   (idcom   ==   " ")
                                      {
                                          idcom   =   gname   ;
                                      }
                                      else
                                    {
                                          idcom   =   idcom   +   ", "   +   gname   ;
                                    }
                                }
                          }
            }
}
str=ds.Tables[0].Rows[dscount][0].ToString()   +   "   "   +   ds.Tables[0].Rows[dscount][1].ToString()   +   "   "   +   idcom;

将组合好的数据添加到界面表格上
  string[]   row   =   str.Split( '   ');
  rows.Add(row);//在界面上添加一行数据
本来是这样直接添加到界面上的,可执行速度太慢,界面象死机一样,然后一下将所有数据一起显示出来。现在改用线程方式,可以一行一行显示,但总体执行时间还是比较长,200多条数据竟然用了50多秒,机器配置不怎么样,内存只有256,但我觉得我的sql语句写的还是有问题的,这样频繁的访问数据库效率肯定低,想请教各位如何能优化这段代码?
}


[解决办法]
先把表B跟表C做一个视图,合并一下,这样查询的次数就少了一半了
[解决办法]
太长了,没耐性看,可以考虑先做视图,然后用执行存储过程来实现
[解决办法]
用left join 对表c进行左关联。这样就不需要拼数据了,肯定比现在快很多
[解决办法]
因为你表A的设计 看来好像不能用LEFT JOIN

建议 一次用一个 SQL 得到 3 个 TABLE 所有需要的数据

然后在前台重新计算合并这些数据 到一个新的DATATABLE

热点排行