2017-07-06 81 views
1

我有兩個訪問表,A和B:查詢Access表比較快的方式

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 

我只是想創建,提取其中「P」 ID沒有在表A中的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行組成),每當我運行查詢時,訪問都會填充查詢進度條,但當接近滿時凍結。

是否有另一種方式做到這一點?

感謝

+0

B.p和A.Identifier都編入了索引嗎? –

+0

我不確定我是否知道您索引的含義。我沒有看到你的答案了:s – naiminp

回答

2

你也可以使用左連接做同樣的事情古斯塔夫。我閱讀起來比較容易,我相信它會按照相同的執行計劃進行操作。

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

並補充說明上面Erik推薦的索引。 (也就是說,如果P和標識符是表中的主鍵,那麼它們已經被編入索引,並且不需要添加索引)

+0

最好的答案在這裏,因爲只有一個產生的結果,而不是凍結! – naiminp

1

你可以「反向」尋道 - 首先找到那些有比賽,然後從表B排除這些:

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

既然你不知道的字段建立索引: 創建兩個字段的索引(見this page by Microsoft關於索引的信息):

執行這些查詢創建索引(或使用GUI)

CREATE INDEX TblAIdentifier ON A(Identifier) 

CREATE INDEX TblBP ON B(p) 

只要您至少創建第一個索引,Access甚至不需要打開表A。它可以在索引中查看哪些字段被採用。

您可以同時使用此答案由@Gustav

+0

感謝您的建議。但是,考慮到這些表是鏈接的,所以我在閱讀表時會更慢,因此我避免了這種方法。將在未來的其他領域採用這種方法。 – naiminp

+0

真的不明白你在說什麼。索引也加速鏈接表,只有索引應該在包含源表的數據庫中創建。如果您從非Access數據庫進行鏈接,則創建索引的語法可能會有所不同。沒有索引的唯一原因是,如果您沒有完全訪問源代碼,或者如果您鏈接的東西不支持Excel(在這種情況下,您應該修復該問題)。 –

+0

在你發送了鏈接,在「決定哪些字段指數」,它指出:「索引可以加快搜索和查詢,但是當您添加或更新數據,他們會降低性能。「所以我很不情願,因爲數據經常更新,每次更新都會增加大約10%的記錄總數。這些錶鏈接到csv文件。 – naiminp

1

提供了一個選擇BP,B.ValidityDate,B.LockInAmount FROM 乙 LEFT JOIN 一個 BP = A.Identifier WHERE A.標識符爲空);