2016-02-11 34 views
1

這對於vba編程來說有點新鮮。我已經寫了這段代碼,現在變得很慢。我剛剛從後端表移到了SQL表。我正在使用的查詢使用NOT IN。我曾在某些地方看過使用NOT EXISTS可能會加快速度。這是我的代碼。我需要NOT EXISTS將它轉換,但我不確定如何:將查詢從NOT IN更改爲NOT EXISTS

SELECT BatchID 
FROM TblBatchInfo 
WHERE (IsNull([RSOutDateTime])=False) 
    AND (IsNull([HBDropDateTime])=False) 
    AND (Format([BatchDateTime],"Short Date")=Format(Now(),"Short Date")) 
    AND (IsNull(PSPassedOut=True) OR (PSPassedOut="")) 
    AND LEN(LabelID)=9 
    AND [Area] <> 5 
    AND [Area] <> 6 
    AND [Area] <> 7 
    AND (BatchID Not In (SELECT [BatchID] 
              FROM [TblBatchInfo] 
              WHERE (IsNull([RSOutDateTime]) = True) 
              AND LEN(LabelID)=9 
              AND [Area] <> 5 
              AND [Area] <> 6 
              AND [Area] <> 7 
              AND (Format([BatchDateTime], "Short Date") = Format(Now(), "Short Date")))) 
GROUP BY BatchID 
ORDER BY BatchID; 
+1

NOT IN子查詢的WHERE子句中的所有內容也都在主WHERE子句中,除了IsNull(RSOutDateTime)的反轉。除非在此表中重複批次ID,否則不應有重疊。我可能會假設錯誤,但是在主SELECT語句中沒有DISTINCT,這讓我懷疑你不會期待同一個ID一遍又一遍。 –

+1

要重新表述我認爲@SteveBarron的說法:只需添加'RSOutDateTime不爲空'的條件並擺脫整個子查詢。 – shawnt00

+0

所以這個查詢被用來創建一個隊列。它將取出所有批次並查看條件是否滿足,並將batchID發佈到列表框以顯示batchID已準備就緒。因此,BatchID每天在整個表中重複多次,每天一次。 – OldSchoolGG

回答

1

使用表的別名,因爲在子查詢中你會引用這兩個表。你也可以做NOT IN (5,6,7)而不是多個<>

SELECT BatchID 
FROM TblBatchInfo x 
WHERE (IsNull([RSOutDateTime])=False) 
    AND (IsNull([HBDropDateTime])=False) 
    AND (Format([BatchDateTime],"Short Date")=Format(Now(),"Short Date")) 
    AND (IsNull(PSPassedOut=True) OR (PSPassedOut="")) 
    AND LEN(LabelID)=9 
    AND [Area] NOT IN (5,6,7) 
    AND NOT EXISTS (SELECT 1 [BatchID] 
        FROM [TblBatchInfo] y 
        WHERE (IsNull([RSOutDateTime]) = True) 
         AND x.[BatchId] = y.BatchID 
         AND LEN(LabelID)=9 
         AND [Area] NOT IN (5,6,7) 
         AND (Format([BatchDateTime], "Short Date") = Format(Now(), "Short Date")) 
        ) 
GROUP BY BatchID 
ORDER BY BatchID;