MS Access中具有NULL值比较的SQL查询

时间:2012-08-27 18:58:08

标签: sql ms-access

我正在尝试比较两个表并输出结果,其中table1中的列和table2中的相同列不相等。

查询如下所示:

Select Table1.Column1, Table1.Column2, Table1.Column3, Table1.Column4
from Table1 INNER JOIN
     Table2
     ON Table1.Column1 = Table2.Column1 AND
        Table1.Column2 = Table2.Column2 AND
        Table1.Column3 = Table2.Column3
WHERE Table1.Column4 <> Table2.Column4;

Column1,Column2,Column3一起构成两个表的主键。

当Column4缺少值(null)时,相应的记录不会显示为结果输出中的不匹配。

(这也适用于其他列,无论是Text还是Number或Date / Time数据类型)

任何评论?

4 个答案:

答案 0 :(得分:4)

您需要LEFT加入,而不是INNER加入。

from Table1 LEFT JOIN

您可能想说:

Select Table1.Column1, Table1.Column2, Table1.Column3, Table1.Column4
from Table1 LEFT JOIN
     Table2
     ON Table1.Column1 = Table2.Column1 AND
        Table1.Column2 = Table2.Column2 AND
        Table1.Column3 = Table2.Column3
WHERE Table1.Column4 & "" <> Table2.Column4 & "";

将零长度字符串与字段连接将确保显示值与null之间的比较。

答案 1 :(得分:0)

在SQL中,不仅NULL不等于任何东西,它也不等于任何东西。

任何与NULL的比较(IS NULL除外)都会产生UNKNOWN值,因此不会返回任何行。

作为一个例子(在这种情况下使用MySQL语法,但Access也是如此);

SELECT 1 FROM DUAL WHERE 0 = 0;
SELECT 2 FROM DUAL WHERE 0 <> 1;
SELECT 3 FROM DUAL WHERE NULL = NULL;
SELECT 4 FROM DUAL WHERE NULL <> 1;

查询1和2显然分别返回1和2,但查询3和4将(不太明显)返回任何内容。

有关此问题的更多信息,请访问this link (scroll to "Error 5")

答案 2 :(得分:0)

对于MS SQL:

WHERE isnull(Table1.Column4,'')&lt;&gt; ISNULL(Table2.Column4, '')

或者,要成为其他SQL实现的标准,请使用'coalesce'而不是'isnull'

答案 3 :(得分:0)

Null 很奇怪。 Null 不等于任何东西(甚至 null),也不等于任何东西(甚至 null)。最简单的解决方案是将空值转换为非空值。在 Access 中,使用 nz() 函数和已知的非真实值。

Select Table1.Column1, Table1.Column2, Table1.Column3, Table1.Column4
from Table1 INNER JOIN
     Table2
     ON Table1.Column1 = Table2.Column1 AND
        Table1.Column2 = Table2.Column2 AND
        Table1.Column3 = Table2.Column3
WHERE nz(Table1.Column4,'~~~') <> nz(Table2.Column4,'~~~')

(在 Oracle 中,使用 nvl()。)

问题不在于连接。在 Table1 和 Table2 中,(Column1, Column2, Column3) 是主键,不能有空值。内连接绝对合适——左连接还会为您提供所有没有匹配 Table2 记录的 Table1 记录,这不是您想要的。