【发布时间】:2017-08-08 14:57:45
【问题描述】:
当我稍微更改用户请求的查询时,我的 Access 2010 数据库表现异常。我有一个非常大的表(不要问),查询在其上运行,然后提供给用户输入表单。无论如何,今天,一种特殊的形式开始返回的结果比我们预期的要少得多。它通常会返回大约 1200 个结果,但经过细微的更改后,它会下降到 880 个结果。当我检查它时,它应该只下降到 1100,所以我错过了另外 300 个预期结果。
我分层构建对此表的查询,以防止事情变得太奇怪。我对 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 或者应该被过滤掉,我不知道它为什么这样做。有什么想法,或者这里的其他地方已经回答了吗?
提前致谢
【问题讨论】:
-
您可以使用
WHERE Len([Day2Day InvPmt a].INV_PT_DT & "") >0 AND [Day2Day InvPmt a].[Step 1 notes]) Not Like "*windsh*"简化 [Day2Day InvPmt a].INV_PT_DT 的 where 子句,这也应该加快查询速度。您确定要在 windsh 之前和之后使用通配符吗? -
@Minty 我需要前后通配符,因为我正在处理不一致的命名约定。我承认我不太确定“LEN”为什么会有用
-
SELECT COUNT(*) AS n FROM [Day2Day InvPmt a] WHERE Nz(INV_PT_DT, "") = "" AND [Step 1 notes] LIKE "*windsh*"是否会为您希望排除的额外行数返回一个合理的值? -
@GordThompson,不,不是。它返回大约 100 个值如果 thisg 是一致的,它应该返回大约 400
-
您的问题似乎表明〜100行实际上是您在添加条件时希望看到的排除。