6

我有 3 个表:NotHeard、analyzed、analyzed2。在这些表中的每一个中,我都有名为 UnitID 和 Address 的两列。

我现在要做的是从 NotHeard 中为 UnitID 和 Address 列选择所有未出现在分析或分析2中的记录。我创建的 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 表中的数据相同,而如果我取出 or NOT EXISTS 部分,它可以正常工作。

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

4

2 回答 2

8

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

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,AND 既不会给您分析,也不会给您分析 2。

于 2010-04-01T23:40:15.367 回答
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 
于 2010-04-01T21:14:14.843 回答