1

我正在做工作经验,我在 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 CourseName CourseDate CustID Notes

“课程表”中还有其他课程的列表 高级喷枪新娘头发中级介绍 提神

客户表

CustID FirstName Surname Email Phone Address1 Address2 Address3 DateOfBirth 额外信息


那是我的问题。我还是想不通怎么办,其他课程的学生不应该是结果的一部分???

这是我想出的代码来找出谁比介绍课程做得更多:

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));

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

4

1 回答 1

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中间的要去掉,中间的分号也是一样。这将为您提供所有参加过入门和中级课程的客户,但仅此而已。同样,这可能不是最有效的解决方案。

于 2013-10-11T12:49:08.633 回答