【问题标题】:Query returning too few results after adding NOT LIKE condition添加 NOT LIKE 条件后查询返回的结果太少
【发布时间】: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 &amp; "") &gt;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行实际上您在添加条件时希望看到的排除。

标签: ms-access ms-access-2010


【解决方案1】:

Not Like 运算符与 Null 值不匹配,即使 Null 值显然与模式不匹配。您需要明确(重新)包含 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)

【讨论】:

  • 宾果游戏!那成功了。非常感谢。它也符合我在 excel 中手动操作所有内容时得到的结果
  • 太棒了!当我得到令人沮丧的查询结果时,NULL 是我脑海中弹出的第一个危险信号。 Null 值如何通过布尔运算传播有一些规则,但它并不总是很直观,所以如果没有特定的测试,我不会假设任何事情。
  • 下次出现时我会记住这一点。我不知道它会把事情搞得这么糟糕
  • 我很确定 Len() 位会捕捉到这一点,因为它会检查 Null 和零长度字符串,它们不是一回事。很高兴你把它分类了。
  • @Minty 您的代码试图简化[Day2Day InvPmt a].INV_PT_DT 的条件,这可能很有用。从技术上讲,您弄错了表达式,因为它应该有一个等号,如 Len([Day2Day InvPmt a].INV_PT_DT &amp; "") = 0 以匹配原始条件。但是您的评论没有解决 Not Like 操作和 [Step 1 notes] 字段出现问题的位置,因此不清楚您的意思。公平地说,([Day2Day InvPmt a].[Step 1 notes] &amp; "") Not Like "*windsh*" 之类的内容也足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2015-05-29
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
相关资源
最近更新 更多