Office中国论坛/Access中国论坛

标题: 查询速度很慢的问题 [打印本页]

作者: yimu    时间: 2010-8-4 13:42
标题: 查询速度很慢的问题
见附件,有两表

表control_no含字段control_no

表tblsalereport也包含字段control_no



我建了两个查询,query2是将这两表control_no字段合并的查询

query1是从合并的数据中选取最小的不重复值

但是运行query1速度很慢,请帮忙看看可以怎么改进,谢谢!
作者: todaynew    时间: 2010-8-4 15:37
以联合查询为基础,可以这样搞法:

SELECT TOP 1 First(a.control_no) AS 最小记录
FROM [SELECT Query2.control_no, Count(Query2.control_no) AS 计数 FROM Query2 GROUP BY Query2.control_no]. AS a
GROUP BY a.计数
ORDER BY a.计数;


从本题来看,以下查询更为合理:

SELECT TOP 1 a.Control_No
FROM Control_No AS a LEFT JOIN tblSaleReport AS b ON a.Control_No=b.Control_No
WHERE (((b.MAWB_NBR) Is Null));

作者: yimu    时间: 2010-8-4 16:44
谢谢楼上的高人,能大概解释下意思不?因为最近工作中可能还需要用到类似语句,我刚刚用help看了,但还是很不明白
谢谢
作者: todaynew    时间: 2010-8-4 17:18
本帖最后由 todaynew 于 2010-8-4 17:19 编辑
谢谢楼上的高人,能大概解释下意思不?因为最近工作中可能还需要用到类似语句,我刚刚用help看了,但还是很 ...
yimu 发表于 2010-8-4 16:44


1、第一个查询的思路是先做一个计数的分组查询,然后对这个计数的分组查询再按照计数进行分组并排序,最后取第一条记录就是你需要的“最小的不重复值”。

2、第二个查询的思路是联接两表,取字段较多,记录较少的某个字段作为判断基础,取值为空的部分是不重复的部分,取该部分的第一条记录也就是你需要的“最小的不重复值”。

除这两个查询外,还应该存在其他的求解方法,只要算法正确同时考虑查询效率,均可得到答案。也就是所谓条条道路通罗马。




作者: yimu    时间: 2010-8-4 17:50
谢谢!有点小明白了。
那么还有更复杂的情况,如果我有三个表
control_no含有字段control_no
salereport1含有字段control_no(不是必填字段,可能为空值)
salereport2含有字段control_no(不是必填字段,可能为空值)
我要从表control_no中选出既不在salereport1,又不在salereport2里出现过的最小值
这个时候要怎么用left join语句呢?
非常感谢您的帮忙!


见附件
作者: todaynew    时间: 2010-8-4 17:58
本帖最后由 todaynew 于 2010-8-4 18:01 编辑

原理一样,在多几个也没关系,呵呵。
SELECT TOP 1 Control_No.Control_No
FROM (Control_No LEFT JOIN salereport2 ON Control_No.Control_No=salereport2.Control_No) LEFT JOIN SaleReport1 ON Control_No.Control_No=SaleReport1.Control_No
WHERE (((salereport2.MAWB_NBR) Is Null) AND ((SaleReport1.MAWB_NBR) Is Null));

[attach]42990[/attach]

作者: yimu    时间: 2010-8-4 18:26
这个问题我解决了,我把salereport1和salereport2联合查询就可以了。谢谢




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3