繁体   English   中英

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

[英]Microsoft Access 97/XP Left Join On Multiple Columns Fails - Vista/7 are fine

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

表1的ROID尽可能长

表2具有ID长,Type长和Status文本。

在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 isull(V.Status)没有任何区别。 XP机器(已测试两个)是SP3。

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

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

微软KB275058

米克罗

首先,一个已知的问题是Access的外部联接不符合标准,产生了意外的结果,因此表达性较差。 SQL Server团队希望修复此“错误”,但遭到Windows团队的破坏 后来不太可能修复引擎。

其次,SQL中的空值通常是灾难。 SQL标准无法定义三值逻辑。 具体来说,访问也无法使用三值逻辑,并且存在许多不一致之处。 最好避免使用null值,并且明确设计了外部联接以生成null。

第三,在SQL中总是存在表达同一事物的多种方法。 您需要的关系运算符是半差分aka 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 ),而我看不到木材的树:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM