如何比较相关表中的日期,并使用它在查询中选择相关记录?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
- 课程版本开始日期紧低于开始日期(参见下面的示例)
- CourseVersionID
选择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;