【问题标题】:Microsoft Access 97/XP Left Join On Multiple Columns Fails - Vista/7 are fineMicrosoft Access 97/XP 左连接多列失败 - Vista/7 没问题
【发布时间】:2012-01-10 17:16:09
【问题描述】:

我试图对两个表进行左连接以获取表 2 中不存在或状态为 null 的所有值:

表 1 的 ROID 很长

表 2 具有长 ID、长类型和状态文本。

这在 Vista 和 Win 7 上运行良好(我得到了 V 中不存在的所有记录),但在 XP 上我没有得到任何记录,

  SELECT roid
  FROM
  wo AS w LEFT JOIN VFlag As V ON (w.roid = V.ID AND V.Type = 2)
  WHERE
  (V.Status is Null) 

当我删除 V.Type = 2 时,它在 XP/Vista/7 上运行良好,但我还需要对 Type 进行限定:

SELECT roid
  FROM
  wo AS w LEFT JOIN VFlag As V ON (w.roid = V.ID)
  WHERE
  (V.Status is Null)  

这在 VB6 中都使用 ADO 和 VisData。尝试 WHERE isnull(V.Status) 没有任何区别。 XP 机器(两台经过测试)是 SP3。

【问题讨论】:

    标签: sql ms-access vb6


    【解决方案1】:

    您是否尝试过将 V.Type = 2 放在 WHERE 子句中而不是连接中?

    【讨论】:

    • 试过了,没用。它可能在该表中没有匹配的 ID。
    • 只是好奇,在 XP 上运行时,您是否尝试查看 V.Type 的值(“SELECT,roid,V.Type...”)从 ON 中移除后有哪些值?在 Vista/7 上?是否所有操作系统上的所有表都包含相同的数据?
    • 是的,我将数据库复制到了几台机器上。继续你之前所说的,我想我可以通过 WHERE 得到它(V.Type 为 Null 或 V.Type = 2)。我还是更愿意找到原因。
    • 我认为您正在做某事。当外连接上没有匹配键时,所有字段都设置为空。由于您只选择没有匹配键的行(V.Status 为 Null),因此 V.Type 始终为空。但是我不明白为什么第一个示例可以在 Vista/7 上运行?在所有平台上省略 V.Type 测试时,您得到正确的结果吗?这里有什么遗漏吗?
    • 这绝对是 XP vs Vista/7 中处理空值的方式。只需将左连接更改为 LEFT JOIN VFlag As V ON (w.roid = V.ID AND (V.Type = 2 or V.Type is null)) 就可以了,所以我会用它作为最简单的方法。厌倦了各种 Jet 更新,什么都没有。无论哪种方式,对我来说都足够了。
    【解决方案2】:

    首先,known issue 表明 Access 的外连接不符合标准,会产生意想不到的结果,因此表达能力较差。 The SQL Server team wanted to fix this 'bug' but was scuppered by the Windows Team;引擎随后被修复的可能性极小。

    其次,SQL 中的空值通常是一场灾难。 SQL 标准未能定义三值逻辑。访问也特别失败了三值逻辑并且有许多不一致之处。最好避免空值,外连接明确设计用于生成空值。

    第三,在 SQL 中表达相同事物的方式总是不止一种。您需要的关系运算符是semi difference a.k.a. antijoin。您的规范显示“获取表 2 中不存在的所有值”,因此请考虑使用 NOT EXISTS,例如

    SELECT roid
      FROM wo AS w 
     WHERE NOT EXISTS (
                       SELECT * 
                         FROM VFlag As V 
                        WHERE w.roid = V.ID 
                              AND V.Type = 2
                      );
    

    我不确定子查询是否应该额外测试 V.Type IS NULL,因为您在规范中包含了实现细节 (LEFT OUTER JOIN),我看不到树木的树木 :)

    【讨论】:

      【解决方案3】:

      我对此有点晚了 - 但我刚刚在 Access 2003 上遇到了同样的问题 似乎该错误已在最新的 JET 中修复。所以可以很好地解释您看到的症状以及如何在 Windows 7 上修复。

      MS KB275058

      麦克罗

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        相关资源
        最近更新 更多