如何比较相关表中的日期,并使用它在查询中选择相关记录?SQL/MS访问

如何比较相关表中的日期,并使用它在查询中选择相关记录?SQL/MS访问,sql,ms-access,relationship,Sql,Ms Access,Relationship,课程的细节会随着时间的推移而变化。我需要能够访问课程运行时最新的这些详细信息的版本 我的表格设置如下(仅显示相关字段): 课程详情 ClassID(主键) CourseID(外键) 生效日期 课程 CourseID(主键) 课程版本 CourseVersionID(主键) CourseID(外键) 课程版本开始日期 我希望在具有以下列的查询中为每个唯一ClassID显示一条记录: ClassID 课程版本开始日期紧低于开始日期(参见下面的示例) 课程版本开始日期(1)=2010年

课程的细节会随着时间的推移而变化。我需要能够访问课程运行时最新的这些详细信息的版本

我的表格设置如下(仅显示相关字段):

课程详情

  • ClassID(主键)
  • CourseID(外键)

  • 生效日期

课程

  • CourseID(主键)
课程版本

  • CourseVersionID(主键)
  • CourseID(外键)

  • 课程版本开始日期

我希望在具有以下列的查询中为每个唯一ClassID显示一条记录:

  • ClassID

  • 课程版本开始日期紧低于开始日期(参见下面的示例)

课程版本开始日期(1)=2010年1月1日

课程版本开始日期(2)=2011年11月1日

开始日期介于(1)和(2)之间~返回值为2010年1月1日

开始日期大于(2)~返回值为2011年11月1日

开始日期小于(1)~返回值为空,此记录不显示

  • CourseVersionID
首选在没有太多SQL知识的情况下(即在Access设计视图中)使用的解决方案,但不是必需的。

在SQL中:

选择Class.ID,
最大值(CourseVersions.CourseVersionStartDate)为CourseVersionStartDate
从…起
(Course.CourseId=Class.CourseId上的课程内部联接类)
内连接
CourseVersions ON Course.CourseId=CourseVersions.CourseId
哪里
(((课程开始日期)>课程结束日期)
按Class.ID分组

或者,因为您更喜欢access查询设计器:


不完全是查询设计窗口,尽管它可以在那里查看,即使没有第五个要求的日期,它也会返回一行

SELECT [class details].classid,
       [class details].courseid,
       [class details].[commencement date],
       (SELECT TOP 1 [course version start date]
        FROM   [course versions]
        WHERE  courseid = courses.courseid
               AND
       [class details].[commencement date] > [course version start date]
        ORDER  BY [course version start date] DESC) AS commdate
FROM   [class details]
       INNER JOIN courses
         ON [class details].courseid = courses.courseid; 

SQL是一个通用标记,并不意味着只有SQL Server,还有一些特定的标记,例如
t-SQL
SQL Server
。我猜您的第一个建议是t-sql,因为它永远不会在Access(Jet/ACE)sql中运行。我重新添加了Access所需的多余括号-现在查询是Access查询的完全复制和粘贴,除了我添加了一些空白以使其更易于阅读之外。我感谢您使用查询设计器并修改原始SQL的努力。我有点害怕,因为我(天真地)认为我可以在查询中添加额外的列,这样查询就会自行排序。然后我发现了这篇很棒的文章,它解释得相当好,当我照原样复制它时,我无法让它工作。我还尝试将“commdate”替换为[class details]。[start date](也许你可以告诉我我是SQL新手),但没有用。@LittleJohn这是从使用了你提到的所有字段的设置的查询设计窗口中剪切粘贴的。CommDate是一个别名,替换它不是一个好主意。当你试图运行它时,你犯了什么错误?我很抱歉,这是一个毫无帮助的评论。我最初误解了查询返回的内容,现在我正确地查看了它,我看到了问题所在。您说过“[…]即使没有符合您的第五个要求的日期,它也会返回一行。”然而,我的“第五个要求”(我想这就是您所指的)是“开始日期小于(1)~返回值为零,此记录不会显示。”当然,使用筛选器可以轻松解决这一问题。
SELECT [class details].classid,
       [class details].courseid,
       [class details].[commencement date],
       (SELECT TOP 1 [course version start date]
        FROM   [course versions]
        WHERE  courseid = courses.courseid
               AND
       [class details].[commencement date] > [course version start date]
        ORDER  BY [course version start date] DESC) AS commdate
FROM   [class details]
       INNER JOIN courses
         ON [class details].courseid = courses.courseid;