MS-Access 查询过滤器在“=”上正常,但在我使用“<>”时不可用?

Posted

技术标签:

【中文标题】MS-Access 查询过滤器在“=”上正常,但在我使用“<>”时不可用?【英文标题】:MS-Access query filters OK on "=" but not when I use "<>"? 【发布时间】:2010-08-19 16:58:46 【问题描述】:

我正在使用 Microsoft Access 2000,

当我使用“=”条件时,此查询正在过滤,但当我使用“”时,它没有过滤。 可能是什么问题?

SELECT tblRevRelLog_Detail.RevRelTrackingNumber, tblRevRelLog_Detail.PartNumber, tblRevRelLog_Detail.ChangeLevel, tblRevRelLog_Detail.Version, tblRevRelLog_Detail.JobPnType, tblRevRelLog_Detail.EdsName, tblRevRelLog_Detail.FmeaText1, tblRevRelLog_Detail.FmeaText2, tblRevRelLog_Detail.LasdtEvent, tblRevRelLog_Detail.DetailerNamePerPartNumber, tblRevRelLog_Detail.DetailerCompanyPerPartNumber
FROM tblRevRelLog_Detail LEFT JOIN tblEventLog ON tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber
WHERE (((tblEventLog.EventTypeSelected)<> 'Pn REMOVED from Wrapper'));

【问题讨论】:

【参考方案1】:

为什么不试试:

SELECT td.RevRelTrackingNumber,
       td.PartNumber,
       td.ChangeLevel,
       td.Version,
       td.JobPnType,
       td.EdsName,
       td.FmeaText1,
       td.FmeaText2,
       td.LasdtEvent,
       td.DetailerNamePerPartNumber,
       td.DetailerCompanyPerPartNumber
FROM   tblRevRelLog_Detail td
LEFT JOIN tblEventLog te ON td.PartNumber = te.PartNumber
WHERE NOT(((te.EventTypeSelected) = 'Pn REMOVED from Wrapper'));

不是一个 Access 的人,但我相信这会实现你想要的。

【讨论】:

我在查询中看不到任何差异,但我仍然尝试并给出相同的结果..如果我从查询中删除 NOT ...它正在过滤记录所以,你们之间没有差异还有我的 如果 Jet/ACE 优化它完全相同,我不会感到惊讶,因为它在逻辑上是等效的。您可以通过打开 SHOWPLAN 来了解(谷歌在“Jet SHOWPLAN”上获取打开它的说明)。作为 Jet/ACE 的一般建议,这也很危险,因为对于子查询,NOT 通常表现不佳,因为由于某种原因它无法使用两边的索引(它在说 IN 和 EXISTS 时确实如此——只有 NOT 会导致问题)。 Access 不喜欢 "!=" 是吗? 另外,您可以使用 AND 而不是 WHERE。 LEFT OUTER JOIN tblEventLog te ON td.PartNumber = te.PartNumber AND ... 我放 ... 因为那将是 NOT 或 或您/我们开始工作的任何一个。 从 tblRevRelLog_Detail 左连接 tblEventLog ON (tblRevRelLog_Detail.PartNumber = tblEventLog.PartNumber) AND (tblEventLog.EventTypeSelected 'Pn REMOVED from Wrapper');这就是你说的对吗?不……这不是正确的语法……【参考方案2】:

也许该列有空值? SQL(因此,我想是 Access)使用three valued logic。有真、假、未知。和 NUll 值假定为未知。所以

WHERE col = 'value'

返回 col 不为 null 且值为 'value' 的所有行

WHERE col <> 'value'

返回 col 不为 null 且 col 的值不是 'value' 的所有行

WHERE col is null

返回 col 为空的所有行。

要返回不满足col = 'value' 的行,您必须使用

WHERE col is null OR col <> 'value'

【讨论】:

你确定吗?左连接可能会在结果集中 tblEventLog 的列上引入 NULL。 如果没有值..当我使用“=”条件时如何比较 正如我在最后提出的答案,使用“IS NULL”。

以上是关于MS-Access 查询过滤器在“=”上正常,但在我使用“<>”时不可用?的主要内容,如果未能解决你的问题,请参考以下文章

查询在 iif ms-access sql 中不返回真值

MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢

查询不会更新子窗体 MS-Access 中的表

查询在 MS-Access 中运行良好,但不能通过 jet 4 在 .net 中执行

在 MS-Access 中插入带日期时间的 SQL 命令

Linq 查询在代码中引发超时,但在 LinqPad 上工作正常