2017-08-08 48 views
2

我有一個Access 2010數據庫,在我稍微更改用戶請求的查詢時表現異常。我有一個非常大的表(不要問),查詢運行,然後提供給用戶輸入表單。無論如何,今天,一個特定的表單返回的結果比我們預期的要少得多。它通常返回大約1200個結果,但是在小的變化之後,結果降至880個。當我檢查它時,它應該只下降到1100,所以我錯過了額外的300個預期結果。在添加NOT LIKE條件後,查詢返回的結果太少

我建立我的查詢層到這張表,以防止變得太奇怪。我不擅長sql,所以我通常只使用設計視圖來構建。如果必須的話,我可以在sql中混淆。

這裏是SQL到第一層

SELECT [New ZSPWAR Prime].Payer, [New ZSPWAR Prime].Bill_doc, [New ZSPWAR Prime].Sqwak, [New ZSPWAR Prime].Billing_Dt, [New ZSPWAR Prime].Issued_Material, [New ZSPWAR Prime].Serial_No, [New ZSPWAR Prime].[review date], [New ZSPWAR Prime].Mtrl_Qty_Billed, [New ZSPWAR Prime].PO_DT, [New ZSPWAR Prime].PO_NO, [New ZSPWAR Prime].PO_PI, [New ZSPWAR Prime].INV_PT_DT, [New ZSPWAR Prime].[Warr Typ], [New ZSPWAR Prime].Stage, [New ZSPWAR Prime].Returned_Material, [New ZSPWAR Prime].Returned_SNR, [New ZSPWAR Prime].Ret_EQUI, [New ZSPWAR Prime].Sales_Ord, [New ZSPWAR Prime].SVO_No, [New ZSPWAR Prime].[ME23N PO_Owner], [New ZSPWAR Prime].Ret_Note, [New ZSPWAR Prime].Ret_Date, [New ZSPWAR Prime].Ret_Note_DESC, [New ZSPWAR Prime].WACD, [New ZSPWAR Prime].Wty_Prog_Code_Desc, [New ZSPWAR Prime].VR_Amount, [New ZSPWAR Prime].Freight_Amt, [New ZSPWAR Prime].VDCD, [New ZSPWAR Prime].Ven_Den_Code_Desc, [New ZSPWAR Prime].ZZ07, [New ZSPWAR Prime].[root cause] AS [Email Follow Up], [New ZSPWAR Prime].[Step 1 Complete], [New ZSPWAR Prime].[Step 1 notes], [New ZSPWAR Prime].[Step 2 complete], [New ZSPWAR Prime].[step 2 notes], [New ZSPWAR Prime].[Step 3 complete], [New ZSPWAR Prime].[step 3 notes], [New ZSPWAR Prime].[Push INV_PMT], [New ZSPWAR Prime].[PO Due Date] 
FROM [New ZSPWAR Prime] 
WHERE ((([New ZSPWAR Prime].Payer) Not Like "10208" And ([New ZSPWAR Prime].Payer) Not Like "2300" And ([New ZSPWAR Prime].Payer) Not Like "32770") AND (([New ZSPWAR Prime].Billing_Dt)>#7/1/2016#) AND (([New ZSPWAR Prime].Mtrl_Qty_Billed)>0) AND (([New ZSPWAR Prime].PO_NO) Not Like "" And ([New ZSPWAR Prime].PO_NO) Is Not Null) AND (([New ZSPWAR Prime].[Step 3 complete])<>Yes)); 

這裏是第二:

SELECT [Day2Day InvPmt a].Payer, [Day2Day InvPmt a].Bill_doc, [Day2Day InvPmt a].Sqwak, [Day2Day InvPmt a].Billing_Dt, [Day2Day InvPmt a].Issued_Material, [Day2Day InvPmt a].Serial_No, [Day2Day InvPmt a].[review date], [Day2Day InvPmt a].Mtrl_Qty_Billed, [Day2Day InvPmt a].PO_DT, [Day2Day InvPmt a].PO_NO, [Day2Day InvPmt a].PO_PI, [Day2Day InvPmt a].INV_PT_DT, [Day2Day InvPmt a].[Warr Typ], [Day2Day InvPmt a].Stage, [Day2Day InvPmt a].Returned_Material, [Day2Day InvPmt a].Returned_SNR, [Day2Day InvPmt a].Ret_EQUI, [Day2Day InvPmt a].Sales_Ord, [Day2Day InvPmt a].SVO_No, [Day2Day InvPmt a].[ME23N PO_Owner], [Day2Day InvPmt a].Ret_Note, [Day2Day InvPmt a].Ret_Date, [Day2Day InvPmt a].Ret_Note_DESC, [Day2Day InvPmt a].WACD, [Day2Day InvPmt a].Wty_Prog_Code_Desc, [Day2Day InvPmt a].VR_Amount, [Day2Day InvPmt a].Freight_Amt, [Day2Day InvPmt a].VDCD, [Day2Day InvPmt a].Ven_Den_Code_Desc, [Day2Day InvPmt a].ZZ07, [Day2Day InvPmt a].[Email Follow Up], [Day2Day InvPmt a].[Step 1 Complete], [Day2Day InvPmt a].[Step 1 notes], [Day2Day InvPmt a].[Step 2 complete], [Day2Day InvPmt a].[step 2 notes], [Day2Day InvPmt a].[Step 3 complete], [Day2Day InvPmt a].[step 3 notes], [Day2Day InvPmt a].[Push INV_PMT], [Day2Day InvPmt a].[PO Due Date] 
FROM [Day2Day InvPmt a] 
WHERE ((([Day2Day InvPmt a].INV_PT_DT) Is Null) AND (([Day2Day InvPmt a].[Step 1 notes]) Not Like "*" & "windsh*")) OR ((([Day2Day InvPmt a].INV_PT_DT) Like "") AND (([Day2Day InvPmt a].[Step 1 notes]) Not Like "*" & "windsh*")) 
ORDER BY [Day2Day InvPmt a].Bill_doc; 

罪魁禍首是這裏這一點:

WHERE ((([Day2Day InvPmt a].INV_PT_DT) Is Null) AND (([Day2Day InvPmt a].[Step 1 notes]) Not Like "*" & "windsh*")) OR ((([Day2Day InvPmt a].INV_PT_DT) Like "") AND (([Day2Day InvPmt a].[Step 1 notes]) Not Like "*" & "windsh*")) 

的部分不計「windsh *」是最近引起混亂的原因。

在添加這一點之前,我得到了1200個回報。之後,我得到了880.我試圖反過來建立這個,只有100或應該被過濾掉,我不知道爲什麼它這樣做。任何想法,或者這已經在這裏的其他地方回答了?

在此先感謝

+1

你也許可以簡化 [Day2Day InvPmt一個where子句] .INV_PT_DT使用 ' WHERE Len([Day2Day InvPmt a] .INV_PT_DT&「」)> 0 AND [Day2Day InvPmt a]。[第1步注意])不喜歡「* windsh *」' 應該加快查詢也是如此。你確定你想在windsh之前和之後使用通配符嗎? – Minty

+0

@Minty我之前和之後都需要通配符,因爲我正在處理不一致的命名約定。我承認我不太清楚爲什麼「LEN」的東西會有用 –

+1

做了SELECT COUNT(*)作爲n從[Day2Day InvPmt a] WHERE Nz(INV_PT_DT,「」)=「」和[Step 1 notes] LIKE「* windsh *」'返回一個你想排除的額外行數的合理值? –

回答

4

即使Null值顯然不符合模式的Not Like運營商不匹配Null值。您需要明確(重新)包含空值。

在設計視圖上的標準網格,輸入類似

Not Like "*windsh*" Or Is Null 

在該SQL語句應該是這個樣子

(([Day2Day InvPmt a].[Step 1 notes]) Not Like "*windsh*" Or ([Day2Day InvPmt a].[Step 1 notes]) Is Null) 
+0

賓果!那就是訣竅。非常感謝。它與我在手動操作excel中的所有內容時所得到的結果相符 –

+1

太棒了!當我收到令人沮喪的查詢結果時,NULL是我心中彈出的第一個紅旗。對於Null值如何通過布爾運算傳播有一些規則,但它並不總是立即直觀,所以如果沒有特定的測試我就不會假設任何東西。 –

+0

下次出現時我會記住這一點。我沒有ide它可以把這件事弄糟 –