我正在尝试比较两个表并输出结果,其中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数据类型)
任何评论?
答案 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 记录,这不是您想要的。