2013-12-14 36 views
1

使用Access 2010.使用一个表中的数据排除另一个结果

我需要制定一个查询,使用一个表的内容来排除另一个表的内容。一张表是地址列表,另一张是配置文件代码列表,其中可能有零个或多个配置文件代码用于任何地址。因此,如果我为邮寄标签创建了一批地址,我想排除具有“无邮件”配置文件代码的所有地址。

我相信这一个需要一个子查询,我从来没有能够得到这样做的窍门。

一般形式:

SELECT * from AddressList 
WHERE NOT IN 
(select code from Profile where AddressList.ID = Profile.ID 
and Profile.code = "No Mail") 
+1

这非常接近。您可能会收到错误消息,因为您需要指定不在子查询结果中的字段。但是,“不在”往往是缓慢的。看看穆里尼克的回答。 –

回答

1

你有正确的想法,但你要找的操作是EXISTS。如果子查询返回一个或多个结果,则评估为true;如果不返回任何行,则评估为false

SELECT * 
FROM AddressList 
WHERE NOT EXISTS 
(select code from Profile where AddressList.ID = Profile.ID and Profile.code = "No Mail") 
+0

这种方法很好。 – user3102928

0

你想写的语法似乎not in最好的工作:

SELECT * 
from AddressList 
WHERE id NOT IN (select id from Profile Profile.code = "No Mail"); 

另一种方式来写这个是使用left join

select al.* 
from AddressList al left join 
    Profile p 
    on p.id = al.id and 
     p.code = "No Mail" 
where p.id is null; 
0

以下是一个更好的办法使用LEFT JOIN做同样的事情。

SELECT * 
FROM AddressList 
LEFT JOIN Profile 
ON AddressList.ID = Profile.ID 
AND Profile.code = 'No Mail' 
WHERE Profile.ID IS NULL 
相关问题