更快速地查询Access表

时间:2017-07-06 14:15:43

标签: sql ms-access

我有两个访问表,A和B:

Table A
Identifier BenefitBase    PlanNav   
1        131368.46      131368.46       
2        201768.8       201768.79
3        54057.46       54057.46    
4        7397.51        7397.51 
5        9931.4         9931.4  
6        178200         178200  
Table B
p      ValidityDate LockInAmount
1      2016-4       3.82
2      2016-4       19.97
3      2016-4       26.85
4      2016-6       34.95

我只想创建一个查询,从B中提取记录,其中" p"表A中未找到ID。 我目前的代码是:

SELECT B.p, B.ValidityDate, B.LockInAmount
FROM B
WHERE (((B.p) Not In (select Identifier from A)));

现在对我来说,这段代码应该可以正常工作。但是,因为这些表是如此之大(B由486,000行组成(" p"在此表中针对不同的日期重复),而A由大约19,000行组成,每当我运行查询时,访问填充查询进度条,但在接近满时冻结。

还有其他办法吗?

谢谢

4 个答案:

答案 0 :(得分:2)

由于您不知道字段是否已编入索引: 为这两个字段创建索引(有关索引的信息,请参阅this page by Microsoft):

执行这些查询以创建索引(或使用GUI)

CREATE INDEX TblAIdentifier ON A(Identifier)

CREATE INDEX TblBP ON B(p)

只要您至少创建第一个索引,Access甚至不需要打开表A。它可以只查看索引中的哪些字段。

您可以将此答案与@Gustav

提供的答案一起使用

答案 1 :(得分:2)

您也可以使用左连接来做Gustav所做的事情。我阅读起来比较容易,而且我相信它会以相同的执行计划运作。

select B.p, B.ValididtyDate, B.LockInAmount
from B
left join A on B.P = A.Identifier
where A.Identifier is null

并在上面添加Erik推荐的索引。 (也就是说,如果P和标识符是表格上的主键,那么它们已被编入索引,您不需要添加索引)

答案 2 :(得分:1)

您可以“反转”搜索 - 首先找到匹配的搜索,然后从表B中排除这些:

Select B.*
From B
Where B.ID Not In
    (Select A.Id
    From A, B
    Where A.ID = B.ID)

答案 3 :(得分:1)

SELECT B.p,B.ValidityDate,B.LockInAmount 从 乙 左连接 一个 沸点= A.Identifier 在哪里A.Identifier是空的);