如何在使用Access SQL VBA的where子句中正确使用两个Not Exists语句?

Bry*_*yan 5 sql vba ms-access-2007 not-exists

我有3个表:NotHeard,分析,分析2.在每个表中,我有两列名为UnitID和Address.

我现在要做的是选择未显示在分析或分析2中的UnitID和Notheeard地址列的所有记录.我创建的SQL语句如下:

SELECT UnitID, Address  
INTO [NotHeardByEither] 
FROM [NotHeard] 
Where NOT EXISTS( Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
or NOT EXISTS( Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
Group BY UnitID, Address 
Run Code Online (Sandbox Code Playgroud)

我认为这样可行,因为我使用了单个NOT EXISTS子查询行,它在过去对我来说效果很好.然而,上面的查询返回NotHeard表中的相同数据,而如果我取出或NOT EXISTS部分它可以正常工作.

关于我做错了什么或如何做我想做的事情的任何想法?

Unr*_*son 7

关于你的原始查询,试试吧

NOT (
   EXISTS( 
    Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
AND EXISTS( 
    Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
    )
Run Code Online (Sandbox Code Playgroud)

这意味着没有.但这与你原来的相同(在样本数据上测试).你确定你不是不是在B中也不是A吗?那就是

NOT (
   EXISTS( 
    Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
OR EXISTS( 
    Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
    )
Run Code Online (Sandbox Code Playgroud)

要意识到EXISTS解决方案正在使用可能比LEFT JOIN和NULL更差的相关子查询,这是一个示例.

SELECT NotHeard.UnitID, NotHeard.Address
FROM (NotHeard LEFT JOIN analyzed ON NotHeard.UnitID = analyzed.UnitID) 
     LEFT JOIN analyzed2 ON NotHeard.UnitID = analyzed2.UnitID
WHERE analyzed.UnitID Is Null OR analyzed2.UnitID Is Null
GROUP BY NotHeard.UnitID, NotHeard.Address;
Run Code Online (Sandbox Code Playgroud)

请注意,与Austin的解决方案相比,我在条件中使用了OR,并且在分析和分析中都不会给你.