我正在做工作,我在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));
现在我需要弄清楚如何隐藏它们,而不是显示谁只做了简介课程而没有别的(?)。
答案 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
,以及中间的分号。这将使您参加介绍和中级课程的所有客户,但没有别的。同样,这可能不是最有效的解决方案。