2013-03-22 81 views
0

我縮小了我的代碼範圍,我面臨的問題是在嘗試調整某些代碼以包含更多結果時。VB6/Access SQL SELECT NOT NOT

參考數據表:

**OG_InUse** 
*C_ID* 
E011 
E011_A 
F012_D 


**Csrc** 
*C_ID* 
E011 
F012 
G001 

這樣的作品,但那裏是沒有的情況下返回結果的代碼 「_ *」

sSql = "SELECT DISTINCT C_ID FROM Csrc WHERE C_ID NOT IN (SELECT DISTINCT C_ID FROM OG_InUse)" 

結果: F012 G001

當我試圖展開上述查詢以從OG_InUse返回C_ID的前4個字符(以移除案例s其中有一個或_A _D等):

sSql = "SELECT DISTINCT C_ID FROM Csrc WHERE C_ID NOT IN (SELECT DISTINCT Left(C_ID, 4) AS C_OG_ID FROM OG_InUse)" 

,我想導致以下(但訪問只是繼續嘗試處理): G001

任何建議可能是什麼導致查詢像這樣旅行?我的第一個想法是檢查別名,但我不確定如何開始測試這個超越分解(我已經完成,我的子查詢返回正確的結果集)。

+0

這兩個表中有多少條記錄? – grahamj42 2013-03-22 20:30:07

+0

這是一個龐大且不斷增長的數據庫,它大約有'Csrc'表中的1000條記錄,'OG_InUse'表中有另外250,000條記錄。是的,就像你提到的那樣,相關的子查詢確實有效......對結果的每個屏幕來說都很痛苦。 – Bernard 2013-03-22 20:32:47

回答

1

鑑於對錶的大小您的詳細信息:

  1. Access將不久

  2. 如果你能OG_InUse.C_ID的後綴分成獨立的場虎頭蛇尾,您的查詢可能會得到更好的優化(但我不知道這是否證明了這種努力...)

+0

謝謝你的提醒grahamj42。我會考慮另一種補救措施,可能會繼續使用WHERE NOT IN的原始代碼,但是在創建OG_InUse記錄時,我可能會插入與每個_1,_2,_3,_4關聯的虛擬4字符記錄,這將刪除該場景。 ..不是最漂亮的解決方案,但它會有效。 – Bernard 2013-03-22 20:58:20

1

您應該總是嘗試使用EXISTS而不是IN來查找SQL解決方案。 您需要的查詢應該使用LIKE關鍵字。 例如:

SELECT DISTINCT C_ID 
FROM CSrc 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM OG_InUse 
    WHERE OG_InUse.C_ID LIKE (CSrc.C_ID + '*') 
) 

編輯

  1. 此瓶坯你需要確保OG_InUse是C_ID索引。
  2. 有序的結果,你可以恢復原來的DISTINCT關鍵字,它有點排序搜索結果(我已經修改了我的答案,顯示此)

進一步編輯

EXISTS通常優於IN,因爲EXISTS子查詢通常不需要全部評估以獲得相同的結果,從而減少CPU和執行時間。在這種情況下,只需要評估SELECT *子查詢以找到第一個匹配的OG_InUse,即SELECT *未得到完整評估。

+0

感謝您的及時響應!我嘗試了你的建議,但是處理查詢花費了大量的時間(並且由於比較的緣故,它不會按默認順序返回)。爲什麼會發生這種情況,你有什麼特別的理由可以想到?我已經閱讀了一些關於爲什麼要使用EXIST而不是IN的內容,並且一定會定期練習。謝謝你的提示! – Bernard 2013-03-22 20:20:53

+0

我不知道可以在Access中執行相關的子查詢,但它們通常是實現結果的緩慢方法。 – grahamj42 2013-03-22 20:27:09