2011-12-12 38 views
1

我在Access中设计数据库的结果建立一个查询2010年通过排除其他查询

我有这个疑问,我希望它的作品:

SELECT Participants.ParticipantID, [FirstName]+' '+[LastName] AS Participant 
    FROM Participants 
    WHERE (((Participants.SiteName)=forms!DailyWorkshops!SiteName) And 
((Participants.YearLookup)=forms!DailyWorkshops!YearLookup)) 
    ORDER BY Participants.FirstName, Participants.LastName; 

现在我不想再查询给我一切。

SELECT Participants.ParticipantID, [FirstName]+' '+[LastName] AS Participant 
    FROM Participants 

    WHERE 

    **exclude all these results 
    (((Participants.SiteName)=forms!DailyWorkshops!SiteName) And 
((Participants.YearLookup)=forms!DailyWorkshops!YearLookup))** 


    ORDER BY Participants.FirstName, Participants.LastName; 

这似乎是工作,但我想知道,这是为了做到这一点,最简单的方法是什么?

SELECT Participants.ParticipantID, [FirstName]+' '+[LastName] AS Participant 
    FROM Participants 
    WHERE Participants.ParticipantID NOT IN 

    (SELECT Participants.ParticipantID FROM Participants WHERE 
    (((Participants.SiteName)=forms!DailyWorkshops!SiteName) And 
((Participants.YearLookup)=forms!DailyWorkshops!YearLookup))) 
    ORDER BY Participants.FirstName, Participants.LastName; 

回答

1

为什么这是不是很简单?

SELECT Participants.ParticipantID, [FirstName]+' '+[LastName] AS Participant 
FROM Participants 
WHERE 
    NOT 
     (((Participants.SiteName)=forms!DailyWorkshops!SiteName) And 
     ((Participants.YearLookup)=forms!DailyWorkshops!YearLookup)) 
ORDER BY Participants.FirstName, Participants.LastName; 

唯一的原因可能是因为在你的栏目,空,你可以与固定的:

SELECT Participants.ParticipantID, [FirstName]+' '+[LastName] AS Participant 
FROM Participants 
WHERE 
    NOT 
     (((Participants.SiteName)=forms!DailyWorkshops!SiteName OR 
      IsNull(Participants.SiteName)) And 
     ((Participants.YearLookup)=forms!DailyWorkshops!YearLookup OR 
      IsNull(Participants.YearLookup))) 
ORDER BY Participants.FirstName, Participants.LastName; 
+0

谢谢 - 这是有效的。我没有意识到你可以做到这一点,并没有嵌套在那里的完整子查询。这些都是必填字段,因此不存在NULL值。但在相关说明中,如果存在NULL值,这是行不通的吗? – maneesha

+0

否,'Null = 5'导致'Null','Null <> 5'导致'Null','NOT(Null)'导致'Null'。导致null的条件从结果中排除该行。 –

1

我想一般来说这种形式:

SELECT field 
from list_a 
where field not in (select field from list_b) 

会去为这种形式:

SELECT a.field 
from list_a a left join (select field from list_b) b on a.field=b.field 
where b.field is NULL 

我觉得JOIN比NOT IN更快。

编辑:更改为显示选择而不是表上的联接。

编辑:我不明白为什么这个答案是投票。

+0

谢谢 - 我想知道如果我应该做一些类型的JOIN而不是NOT IN。至于你的例子,我正在寻找排除原始查询的结果,而不是查找NULL结果。 – maneesha

+0

是的。我的代码中的NULL意味着在B中没有找到与A中的连接值相对应的内容。因此它会显示不在b中的选定字段的值。在你的情况下,你会找到复合键sitename和year的参与者值。而且你会加入你的选择而不是加入表格。 – mikeY

+0

这是一个很好的解决方案,根据您的样本排除来自不同的表格。在问题中,如果它是同一张表,则简单更改标准就更好了。 –