【问题标题】:SQL query with NULL Value Comparison in MS AccessMS Access 中具有 NULL 值比较的 SQL 查询
【发布时间】:2012-08-27 18:58:07
【问题描述】:

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

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

有什么意见吗?

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    您需要 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 & "";
    

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

    【讨论】:

    • 或者只是 'WHERE table2.column4 is null'
    • @Beth,这不会捕获 table1.column4 为空的情况,它需要添加到 where 语句以在字段不为空时进行比较。
    • 我以为他指的是 table2.column4,但如果他在 table1.column4 中有空值并希望显示所有非空 table2.column4 行,那么是的,他需要做你所描述的。
    • 嗨 Remou,我实际上使用的是 LEFT JOIN,但我认为 & "" 似乎可以解决问题,你能解释一下它的作用吗?
    • 它将 null 更改为零长度字符串。 "abc" & "" = "abc" 但为空 & "" = ""。您可以将“abc”与“”进行比较,但不能与 null 进行比较。
    【解决方案2】:

    在 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")

    【讨论】:

      【解决方案3】:

      对于 MS SQL:

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

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

      【讨论】:

      • 这是否适用于所有数据类型、数字、文本、日期/时间和布尔值(是/否)?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多