多个列上的Microsoft Access 97 / XP左连接失败 - Vista / 7很好

时间:2012-01-10 17:16:10

标签: sql ms-access vb6

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

表1的ROID为

表2包含ID long,Type long和Status text。

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

首先,它是known issue,Access的外部联接不符合标准,产生意想不到的结果,结果不那么富有表现力。 The SQL Server team wanted to fix this 'bug' but was scuppered by the Windows Team;随后发动机固定不太可能。

其次,SQL中的空值通常是一种灾难。 SQL标准无法定义三值逻辑。特别是访问也没有三值逻辑,并且有许多不一致。最好避免使用null值,并且明确设计外连接以生成空值。

第三,在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)而我看不到树木的树木:)< / p>

答案 2 :(得分:0)

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

MS KB275058

mikecro