日期:2014-05-19  浏览次数:20895 次

如何优化这段查询代码
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 ");