[英]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上修复它。
米克罗
首先,一个已知的问题是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.