2011-03-03 103 views
1

我有兩個表,如父子。在父表中,有7211條記錄。在兒童中,有169498條記錄。在這兩個表之間沒有關係(意味着沒有設置外鍵,但使用parentID)。在子表中,有額外的記錄和缺少的記錄。Access 2000查詢執行時間

爲樣本,

Parent Table - tblParent 
PID  PName 
A001 John 
B002 Mary 
...  ... 

Child Table - tblChild 
PID TID Desc 
A001 056 Book 
Y004 087 Pen 
... ... ... 

我的查詢是像下面,

SELECT PID 
FROM tblParent 
WHERE PID NOT IN 
(
SELECT PID 
FROM tblChild 
) 

與實際不運行它。的記錄,MS Access 2000突然停止。如果我用10條記錄測試它,它可以正常工作。主要原因是什麼?沒有記錄?

我嘗試另一種方式。

SELECT C.PID, P.PID 
FROM tblChild C, tblParent P 
WHERE C.PID <> P.PID 

此時,乘法結果出來。 (我的意思是一個C.PID與所有P.PID,然後等......)

如何在Access 2000中最短的執行時間內獲得額外的和缺少的記錄?

回答

0

這是因爲你選擇169 498條記錄中的子查詢:

SELECT PID 
FROM tblChild 

這是一個很多。整個tblChild表可能被掃描,從磁盤讀取,PID列被分離並存儲在內存中的所有169個498值。然後,您讀取全部7211條記錄,並檢查它們是否不在龐大的169 498個大小的兒童PID數據集中。對於Access來說這是很多工作。

1

首先,您確實在PID列上有一個索引?它應該是tblParent中的主鍵和tblChild中的非唯一索引。設置外鍵關係會爲你創建這些索引(我相信)。

您可以減少需要匹配的記錄數。如果你運行該SQL:

SELECT DISTINCT PID 
FROM tblChild 
WHERE PID IN (
    SELECT PID 
    FROM tblParent 
) 

你只會得到父PID的,應該是在tblParent表。然後像

SELECT PID 
FROM tblParent 
WHERE PID NOT IN 
(
    SELECT DISTINCT PID 
    FROM tblChild 
    WHERE PID IN (
     SELECT PID 
     FROM tblParent 
    ) 
) 

應該幫助加快查詢找到沒有孩子的所有父母。

要找到額外的兒童的記錄,你可以做

SELECT DISTINCT PID 
FROM tblChild 
WHERE PID NOT IN (
    SELECT PID 
    FROM tblParent 
) 

不幸的是,我沒有訪問測試了這一點。我希望它可以幫助

+3

NOT IN在Jet/ACE中沒有很好的優化,有時不會使用雙方的索引。爲什麼不將它重寫爲LEFT JOIN?這肯定會使用雙方的索引。 –