使用WHERE条件

时间:2017-09-15 22:22:52

标签: ms-access inner-join where-clause

我正在使用MS Access 2010并且正在努力解决以下问题。假设我有两个表,tblWeeklyData和tblMainData,它们都包含有关学生及其类的信息。每个表中的记录由公共密钥fldStudentNumber链接。假设两个表都包含字段fldClass,其中包含学生正在服用的Class的名称。

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

我希望查询这两个表来识别tblWeekData中已经存在于tblMainData(在StudentNumber上匹配)并且正在研究新类的学生,即tblWeeklyData.fldClass和tblMainData.fldClass之间没有匹配的特定学生。

[编辑]查询不应返回tblWeeklyData中tblMainData中没有匹配的StudentNumber的新学生。[/ Edit]

我正在使用的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

我希望查询只返回&#34; A0001牙科&#34;从tblWeeklyData作为牙科是唯一的*新&#34;现有学生A0001正在学习的班级。但是,查询返回:

fldStudentNumber fldClass
A0001            Chemistry
A0001            Dentistry 

我不想排#34; A0001化学&#34;返回,因为化学不是学生A0001的新课程,因为它已存在于tblMainData中。

[编辑]为了证明不应该退回新学生,假设有两个表

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

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

此处,不应返回学生A002,因为它不存在于tblMainData中。这可能吗?

[/编辑]

我尝试了上述查询的许多变体但没有成功。我在上一个例子中可以看到WHERE子句的计算结果为true,其中&#34; Chemistry&lt;&gt;艺术&#34;或&#34;化学&lt;&gt;生物学&#34;所以我需要一个不同的WHERE条件来查看* every&#34;一个给定的学生正在学习以确定一个班级是否是新的。我查看了SQL EXISTS IN和子查询,但我还没有解决它。

1 个答案:

答案 0 :(得分:0)

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)