在Access中使用2个过滤器进行查询

时间:2013-10-08 13:34:58

标签: sql ms-access join filter ms-access-2007

我正在做工作,我在Microsoft Access 2007中创建了过去学生的数据库。

我在创建查询时遇到问题,以过滤已完成入门课程但没有其他内容的学生。我想我需要2个过滤器。

我有两张桌子:客户和课程有一对多关系:每个客户/学生可以参加一门或多门课程。

所以有些学生做了一门或多门课程。我有111名学生做过入门课程。但是他们中的一些人也做了中级课程,或者同时也做了中级课程和高级课程。

我需要过滤那些已完成入门课程但没有其他内容的学生;

谁完成了入门课程和中级课程,但没有其他课程;

我正努力将这些学生分开

目前我的SQL语句如下所示:

SELECT Customers.FirstName, Customers.Surname, Customers.Email, Courses.CourseName,              Courses.CourseDate, Customers.CustID
FROM Customers INNER JOIN Courses ON Customers.CustID = Courses.CustID
WHERE (((Courses.CourseName) Like "Intro?*"))
ORDER BY Customers.FirstName;

目前的结果是111名学生。但是其中一半以上的人也参加了其他课程(如果你手动计算)。

我需要过滤那些只完成入门课程但没有别的学生(学生名单 - 他们的详细信息,没有做过其他课程的学生,只是简介);

我想创建一个查询,以找出谁已经完成了入门课程但没有别的;

第二个问题是找出谁做过“入门课程和中级课程但没有别的”。


课程表

CourseID 课程名 CourseDate 客户ID 备注

“课程表”中列出了其他课程 高级 喷枪 新娘 头发 中间 介绍 Refreshner

客户表

的CustID 名字 姓 电子邮件 电话 地址1 地址2 地址3 出生日期 额外信息


这是我的问题。我仍然无法弄清楚如何做其他课程的学生不应该成为结果的一部分???

这是我提出的代码,以找出除了简介课程以外的人员:

SELECT Customers.FirstName, Customers.Surname, Customers.Email,      Count(Courses.CourseName) AS CountOfCourseName, Courses.CustID
FROM Customers INNER JOIN Courses ON Customers.CustID = Courses.CustID
GROUP BY Customers.FirstName, Customers.Surname, Customers.Email, Courses.CustID
HAVING (((Count(Courses.CourseName))>1));

现在我需要弄清楚如何隐藏它们,而不是显示谁只做了简介课程而没有别的(?)。

1 个答案:

答案 0 :(得分:1)

通常我建议您阅读有关子查询和组合查询的内容。 在您的尝试中,您会错过客户与课程之间的“但不喜欢”依赖关系。 我在PostgreSQL中尝试了以下内容,所以我不知道这个改编版本是否适用于Access。 它也可能不是最有效的解决方案。

SELECT FirstName, Surname, Email, CourseName, CourseDate, Customers.CustID
    FROM Customers INNER JOIN Courses ON Customers.CustID = Courses.CustID
    WHERE CourseName LIKE "Intro*" AND Courses.CustID NOT IN
        (SELECT CustID
            FROM Courses
            WHERE CourseName IN ("Advanced", "Airbrush", "Bridal", "Hair", "Intermediate", "Refreshner"))
ORDER BY FirstName;

对于第二个查询,您可以使用“中级”切换“简介”。这将为您提供仅参加中级课程的所有客户。然后,您必须使用UNION将此查询与第一个查询(SELECT [A] UNION SELECT [B])合并。当然,必须删除中间的ORDER BY FirstName,以及中间的分号。这将使您参加介绍和中级课程的所有客户,但没有别的。同样,这可能不是最有效的解决方案。