如何优化这段查询代码

KissApple 2007-04-21 08:57:06
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语句写的还是有问题的,这样频繁的访问数据库效率肯定低,想请教各位如何能优化这段代码?
}
...全文
260 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankla 2007-04-22
  • 打赏
  • 举报
回复
因为你表A的设计 看来好像不能用LEFT JOIN

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

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

lao_ben_niu 2007-04-22
  • 打赏
  • 举报
回复
用left join 对表c进行左关联。这样就不需要拼数据了,肯定比现在快很多
破碎的脸 2007-04-22
  • 打赏
  • 举报
回复
回来再看。。。。祝好运。。。。。干活中。。。
bbdog 2007-04-22
  • 打赏
  • 举报
回复
数据表结构设计不合理!!!
ustbwuyi 2007-04-21
  • 打赏
  • 举报
回复
太长了,没耐性看,可以考虑先做视图,然后用执行存储过程来实现
amandag 2007-04-21
  • 打赏
  • 举报
回复
这种SQL研究不多 关注
huangdong1900 2007-04-21
  • 打赏
  • 举报
回复
我顶
QuinsonYue 2007-04-21
  • 打赏
  • 举报
回复
帮顶
Fibona 2007-04-21
  • 打赏
  • 举报
回复
先把表B跟表C做一个视图,合并一下,这样查询的次数就少了一半了
wshuangminlg 2007-04-21
  • 打赏
  • 举报
回复
帮楼主顶了~

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧