不等于“<>”不工作

时间:2014-08-04 17:39:12

标签: sql ms-access-2010

我试图在Access 2010中构建一个简单的查询。

SELECT tblData.URSampleID, tblData.DateInfoReqSent
FROM tblData
INNER JOIN tblLinkData ON tblData.URSampleID = tblLinkData.URSampleID
WHERE (((tblData.DateInfoReqSent)<>[tblLinkData].[DateInfoReqSent]));

这不会返回任何值。它应该在我的虚拟数据库中返回三行数据。

然而;

SELECT tblData.URSampleID, tblData.DateInfoReqSent
FROM tblData
INNER JOIN tblLinkData ON tblData.URSampleID = tblLinkData.URSampleID
WHERE (((tblData.DateInfoReqSent)=[tblLinkData].[DateInfoReqSent]));

运作并返回正确的数据。

[DateInfoReqSent]是两个表中的日期字段。

我尝试使用NOT,如下所示:

SELECT tblData.URSampleID, tblData.DateInfoReqSent
FROM tblData
INNER JOIN tblLinkData ON tblData.URSampleID = tblLinkData.URSampleID
WHERE (NOT((tblData.DateInfoReqSent)=[tblLinkData].[DateInfoReqSent]));

但这与上面<>的结果相同。

我的语法有什么问题?提前谢谢。

根据要求提供其他信息。

tblLinkData

URSampleID  DateInfoReqSent
15001003    7/31/2014
15004027    7/31/2014
15000265    7/31/2014
15001794    7/31/2014
15002246    8/4/2014
15004088    8/4/2014
15006457    8/4/2014
15000524    8/4/2014

tblData

URSampleID  DateInfoReqSent
15001003    
15004027    
15000265    
15001794    7/31/2014
15002246    8/4/2014
15004088    8/4/2014
15006457    8/4/2014
15000524    8/4/2014

在测试下面的答案之后,我想出了以下内容:

SELECT tblData.URSampleID, tblData.DateInfoReqSent
FROM tblData INNER JOIN tblLinkData ON tblData.URSampleID = tblLinkData.URSampleID
WHERE (nz(tblData.DateInfoReqSent,'') <> nz([tblLinkData].[DateInfoReqSent],''));

和/或

SELECT tblData.URSampleID, tblData.DateInfoReqSent
FROM tblData INNER JOIN tblLinkData ON tblData.URSampleID = tblLinkData.URSampleID
WHERE (((tblData.DateInfoReqSent)<>tblLinkData.DateInfoReqSent)) Or
(((tblData.DateInfoReqSent) Is Null) And ((tblLinkData.DateInfoReqSent) Is Not Null)) Or
(((tblData.DateInfoReqSent) Is Not Null) And ((tblLinkData.DateInfoReqSent) Is Null));

两者都有效。

感谢您的帮助。我感谢您的时间和精力。

2 个答案:

答案 0 :(得分:4)

您的where条款:

WHERE tblData.DateInfoReqSent <> [tblLinkData].[DateInfoReqSent]

不一定是你所期望的。如果两列都有值,则只有具有不匹配值的行才会通过。但是,其中一个或两个值为NULL的行也将无法进行比较。 NULL导致比较失败(is null除外),即使是<>也是如此。

您可以使用NZ()填写值:

WHERE NZ(tblData.DateInfoReqSent, '') <> NZ([tblLinkData].[DateInfoReqSent], '')

或明确包含逻辑:

WHERE tblData.DateInfoReqSent <> [tblLinkData].[DateInfoReqSent] or
      tblData.DateInfoReqSent is null and [tblLinkData].[DateInfoReqSent] is not null or
      tblData.DateInfoReqSent is not null [tblLinkData].[DateInfoReqSent] is null

答案 1 :(得分:2)

实际上,在我对你的帖子添加评论之后,我想知道你是否有一个空白而不是&#39;&#39;你的数据库中的问题。

在您的帖子中使用您的主查询,我在SQL Fiddle中针对此设置运行它(在tblData中插入&#39;&#39;以及未在tblData中发布的日期):

http://www.sqlfiddle.com/#!3/6c643/1

返回3天。但是,当我将空值插入混合而不是&#39;&#39;时,我没有回来。

http://www.sqlfiddle.com/#!3/325ab/1

在查询数据库时,您需要捕获空值,或者确保将空标记放入数据库中。最简单的方法是更改​​你的WHERE子句(你不需要所有那些额外的括号):

 WHERE isnull(tblData.DateInfoReqSent, '')<> isnull([tblLinkData].[DateInfoReqSent],'');

免责声明:我只能通过SQL Server 2008确认这一点;我认为在这种情况下,访问设置不会有太大的不同。