MS Acces加入查询与WHERE条件

问题描述:

我正在使用MS Access 2010并苦苦寻找以下查询。假设我有两张表,tblWeeklyData和tblMainData,它们都包含有关学生及其班级的信息。每个表中的记录通过公共密钥fldStudentNumber进行链接。假设这两个表还包含字段fldClass,其中包含学生正在使用的班级的名称。MS Acces加入查询与WHERE条件

tblWeeklyData保存新的学生信息,并与tblMainData进行比较,以仅识别正在学习新课程的现有学生。

我要查询两个表,以确定学生tblWeeklyData已经在tblMainData(上StudentNumber匹配),并且存在正在研究一个新的类,即有针对特定学生tblWeeklyData.fldClass和tblMainData.fldClass之间不匹配。 。

[编辑]内tblWeeklyData新来的学生没有在tblMainData匹配StudentNumber不应由该查询返回[/编辑]

我使用的SQL是:

SELECT [tblWeeklyData].fldStudentNumber, [tblWeeklyData].fldClass 
FROM tblWeeklyData INNER JOIN tblMainData ON 
([tblWeeklyData].fldStudentNumber = tblMainData.fldStudentNumber) 
WHERE ((([tblWeeklyData].fldClass)<>[tblMainData].[fldClass])); 

如果tblWeeklyData包含行

fldStudentNumber fldClass 
A0001   Chemistry 

和tblMainData包含

fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 

上述查询正确地从tblWeeklyData现有的学生A0001返回研究新类化学:

fldStudentNumber fldClass 
A0001   Chemistry 

但是,此查询不与下面的数据工作:

tblWeeklyData 
------------- 
fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 

blMainData 
---------- 
fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 
A0001   Chemistry 

我想查询仅从tblWeeklyData返回“A0001牙科”,因为牙科是现有学生A0001正在学习的唯一的“新”类。然而,该查询返回:

fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 

我不想排“A0001化学”被返回化学是不是学生A0001一个新的类,它已经在tblMainData存在。

[编辑]为了证明不应该返回新同学,假设有

tblWeeklyData 
------------- 
fldStudentNumber fldClass 
A0001   Chemistry 
A0001   Dentistry 
A0002   Zoology 

blMainData 
---------- 
fldStudentNumber fldClass 
A0001   Art 
A0001   Biology 
A0001   Chemistry 

在这里,学生A002不应该,因为它不存在tblMainData返回两个表。这可能吗?

[/编辑]

我曾尝试没有成功上述查询的许多变型。在最后一个例子中,我可以看到WHERE子句的计算结果为“化学<>艺术”或“化学<>生物学”,因此我需要一个不同的WHERE条件来查看给定学生正在研究的每个“班级”如果一个类是新的,我已经看过SQL EXISTS IN和子查询,但我还没有能够解决它。

在这个问题上的任何帮助将衷心感谢,

问候

罗比

WHERE不起作用,因为它只比较相同行的值,你需要比较第一个表的每个值都与第二个表的每个值相关,但不包括两个表。

如果你这样做是为了每次只有一个学生,你可以使用IN

SELECT fldStudentNumber, fldClass 
FROM tblWeeklyData 
WHERE fldStudentNumber='A0001' 
    AND fldClass NOT IN (SELECT fldClass FROM tblMainData WHERE fldStudentNumber='A0001') 

如果您需要做的几个学生在同一时间或有一个以上的条件,那么你需要用户EXISTS代替:

SELECT fldStudentNumber, fldClass 
FROM tblWeeklyData 
WHERE NOT EXISTS (SELECT * FROM tblMainData 
    WHERE tblMainData.fldStudentNumber=tblWeeklyData.fldStudentNumber 
    AND tblMainData.fldClass=tblWeeklyData.fldClass) 
+0

谢谢阿尔贝托 - 您所提供的解决方案完美地工作,但是,我看到我的问题的初步框架过于简化,并没有指出应返回唯一存在两个表中的学生。例如,如果在tblWeeklyData中存在一个新学生,该新学生在tblMainData中没有匹配的StudentNumber,则不应返回。我会去我的第一篇文章,并编辑它来进一步解释我的意思, – RobbieThompson73