我有两个访问表,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行组成,每当我运行查询时,访问填充查询进度条,但在接近满时冻结。
还有其他办法吗?
谢谢
答案 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是空的);