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

问题描述 投票:0回答:3

我有 3 个表:NotHeard、analyzed、analyzed2。在每个表中,我都有两列,分别名为 UnitID 和 Address。

我现在想做的是从NotHeard 中选择UnitID 和Address 列中未出现在analyze 或analyze2 中的所有记录。我创建的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 

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

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

sql vba ms-access-2007 not-exists
3个回答
10
投票

关于您原来的查询,请尝试

NOT (
   EXISTS( 
    Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
AND EXISTS( 
    Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
    )

这意味着两者都不存在。但这与您最初的结果相同(在样本数据上进行测试)。你确定你的意思不是既不在A也不在B吗?那就这样了

NOT (
   EXISTS( 
    Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
OR EXISTS( 
    Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
    )

请意识到 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;

请注意,与 Austin 的解决方案相比,我在条件中使用了 OR,并且不会给您 inanalyze 或 inanalyze2。


0
投票

看起来您想要左连接。 我的 Access 语法可能有点偏差。

SELECT UnitID, Address  
INTO [NotHeardByEither] 
FROM [NotHeard] 
    LEFT JOIN [analyzed] ON [NotHeard].UnitID = [analyzed].UnitID
    LEFT JOIN [analyzed2] ON [NotHeard].UnitID = [analyzed2].UnitID
WHERE IsNull([analyzed].UnitID)
    AND IsNull([analyzed2].UnitID)
Group BY UnitID, Address 

0
投票

他们是天才。我能够用答案解决问题:

不是( 存在( 选择已分析的.UnitID FROM已分析的 WHERE [NotHeard].UnitID =已分析的.UnitID) 并且存在( 从分析2中选择分析2.UnitID,其中[NotHeard].UnitID =分析2.UnitID) )

© www.soinside.com 2019 - 2024. All rights reserved.