【问题标题】:Comparing rows in MS access tables比较 MS 访问表中的行
【发布时间】:2013-02-01 05:07:27
【问题描述】:

我在这两个表中有这样的值。我想检查 TableA 和 TableB 中的重复项

    TABLEA
    StaffName   Shift   Hrs
    ABC           1      12
    DEF                  23
    XYZ           2          


    TABLEB
    StaffN       Sft   Hrs
    ABC           1      12
    DEF                  23
    XYZ           2          

但是当我做一个

  SELECT * FROM TABLEA 
  WHERE NOT EXISTS 
  (SELECT * FROM TABLEB.StaffN = TABLEA.StaffName AND
  TABLEB.Sft = TABLEA.Shift AND
  TABLEB.Hrs = TABLEA.Hrs); 

为什么我会返回 DEF 和 XYZ?是因为空值吗?以及如何更改我的选择语句以检查两个值是否为空,是否相同。

【问题讨论】:

    标签: sql ms-access duplicates subquery ms-access-2007


    【解决方案1】:

    是的,你怀疑 Null 是对的。

    考虑“DEF”行中的 3 个值:DEF;空值; 23. 人们可能会说这些行是重复的,因为这两个表中的所有 3 个值都相同。

    但是,子查询要求数据库引擎考虑是否TABLEB.Sft = TABLEA.Shift。还有一个问题……一个 Null 永远不可能等于任何东西,甚至另一个 Null 也不可能。

    看看这个即时窗口会话是否说明了情况。

    ? 1 = 1
    True
    ? 1 = 2
    False
    ? 1 = Null
    Null
    ? Null = Null
    Null
    

    所以当两个字段都为 Null 时,比较 TABLEB.Sft = TABLEA.Shift 被评估为 Null。 db 引擎将只包含比较为True 的行,因此排除那些“DEF”行。同样的逻辑解释了为什么“XYZ”行被排除在外。

    您需要一个比较,当 TABLEB.SftTABLEA.Shift 都为 Null 时返回 True,并且当两者包含相同的非 Null 值时还返回 True

    (TABLEB.Sft Is Null AND TABLEA.Shift Is Null)
    OR
    (TABLEB.Sft = TABLEA.Shift)
    

    试试这个查询:

    SELECT *
    FROM
        TABLEA AS a
        INNER JOIN TABLEB AS b
        ON a.StaffName = b.StaffN
    WHERE
        (
            (a.Shift Is Null AND b.Sft Is Null)
            OR
            (a.Shift = b.Sft)
        )
        AND
        (
            (a.Hrs Is Null AND b.Hrs Is Null)
            OR
            (a.Hrs = b.Hrs)
        );
    

    【讨论】:

    • 哇,但我有 27 列,这意味着必须努力吗?
    • 是的,这是一个挑战。但是,将您原来的方法扩展到 27 列也是一个挑战。您可以按照@sgeddes 的建议使用Nz(),前提是所有存储的数字都不是零。或者用其他一些“神奇”数字代替零......如果所有存储的数字都是正数,您可以在比较中使用Nz(a.Shift, -1) = Nz(b.Sft, -1)
    • 当心Nz() 只能在从 Access 会话中运行查询时使用。如果您需要从 Access 外部(例如从 Dot.Net 或 Classic ASP)运行查询,Nz() 将不可用。在这种情况下,您可以改用IIf()IIf(a.Shift Is Null, -1, a.Shift) = IIf(b.Sft Is Null, -1, b.Sft) Null 具有挑战性!
    • 请问,在访问中,空值意味着null吗? sry 不习惯访问
    • 如果您的文本或备注字段包含空字符串(长度为 0 的字符串值,“”),则该字段将显示为“空”。但是那种空和Null是不一样的。对于日期、是/否和其他数字字段,空表示 Null。
    【解决方案2】:

    您可以将您的 where 条件包裹在 NZ 函数周围,看看是否有帮助,例如:

    NZ(TABLEB.Hrs,0) = NZ(TABLEA.Hrs,0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多