我试图在两个表上进行左连接以获取表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。
答案 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上的修复方法。
mikecro