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 查询过滤器在“=”上正常,但在我使用“<>”时不可用?的主要内容,如果未能解决你的问题,请参考以下文章
MS-Access:SQL JOIN 和 INSERT INTO 与 WHERE 慢