4

我正在尝试比较两个表和输出结果,其中 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) 时,相应的记录不会在结果输出中显示为不匹配。

(这也发生在其他列上,无论是文本、数字还是日期/时间数据类型)

任何意见?

4

4 回答 4

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 & "";

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

于 2012-08-27T19:04:19.890 回答
1

在 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 将(不太明显)不返回任何内容。

有关此链接的 Access 中的更多信息(滚动到“错误 5”)

于 2012-08-27T19:15:13.787 回答
0

对于 MS SQL:

WHERE isnull(Table1.Column4,'') <> isnull(Table2.Column4,'')

或者,为了对其他 SQL 实现更标准,使用 'coalesce' 而不是 'isnull'

于 2012-08-27T19:58:50.820 回答
0

空是奇怪的。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 记录,这不是您想要的。

于 2021-05-14T17:45:13.403 回答