【问题标题】:Query with 2 filters in Access在 Access 中使用 2 个过滤器进行查询
【发布时间】:2013-10-15 11:08:33
【问题描述】:

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

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

我有两个表:Customers 和 Courses,具有一对多关系:每个客户/学生都可以参加一门或多门课程。

所以有些学生修了一门或多门课程。我有 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 名学生。但他们中超过一半的人也上过其他课程(如果你手动计算的话)。

我需要过滤只完成了介绍课程但没有其他任何课程的学生(学生列表 - 他们的详细信息,没有参加任何其他课程,只是介绍);

我想创建一个查询来找出谁完成了介绍课程,但没有别的;

第二个查询是找出谁上过“入门课程和中级课程,但没有别的”。


课程表

课程编号 课程名 课程日期 客户 ID 备注

“课程表”中有其他课程的列表 先进的 喷枪 新娘 头发 中间的 介绍 提神剂

客户表

客户 ID 名 姓 电子邮件 电话 地址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));

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

【问题讨论】:

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


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

【讨论】:

  • @user2858791,建议的查询是否有效或是否需要修改?如果你必须修改它,你改变了什么?
  • @user2858791,请将此答案标记为已接受,如果它解决了您的问题。 More about accepting an answer.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多