我有 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 部分,它会正常工作。
关于我做错了什么或如何做我想做的事情有什么想法吗?
关于您原来的查询,请尝试
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。
看起来您想要左连接。 我的 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
他们是天才。我能够用答案解决问题:
不是( 存在( 选择已分析的.UnitID FROM已分析的 WHERE [NotHeard].UnitID =已分析的.UnitID) 并且存在( 从分析2中选择分析2.UnitID,其中[NotHeard].UnitID =分析2.UnitID) )