我有两个访问表,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我只想创建一个从表A中找不到"p“ID的B中提取记录的查询。我当前的代码是:
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行组成),每当我运行查询时,access都会填满查询进度条,但在接近满时会冻结。
有没有其他方法可以做到这一点?
谢谢
发布于 2017-07-06 22:50:27
您还可以使用左连接来执行与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和Identifier是表上的主键,那么它们已经被索引了,您不需要添加索引)
发布于 2017-07-06 22:45:30
由于您不知道字段是否已被索引:为两个字段创建索引(有关索引的信息,请参阅this page by Microsoft ):
执行这些查询以创建索引(或使用GUI)
CREATE INDEX TblAIdentifier ON A(Identifier)
CREATE INDEX TblBP ON B(p)只要您至少创建了第一个索引,Access甚至不需要打开表A。它可以只在索引中查看哪些字段被采用。
您可以将此答案与@Gustav提供的答案一起使用
发布于 2017-07-06 22:40:55
你可以“反向”查找--首先找到那些匹配的,然后从表B中排除它们:
Select B.*
From B
Where B.ID Not In
(Select A.Id
From A, B
Where A.ID = B.ID)https://stackoverflow.com/questions/44951468
复制相似问题