如何在Access中限制查询仅显示员工最近一次培训记录
解决Access中只显示员工每项培训最近记录的问题
嘿,刚学Access的话,咱们一步一步来,绝对能轻松搞定你的需求!你要的是每个员工的每项培训只保留最近完成的那一条记录,同时显示员工姓名、培训标题、日期和到期计算值,对吧?我给你两种方法,先讲最适合新手的可视化操作,再给你进阶的SQL代码选项~
方法一:用查询设计视图(纯鼠标操作,新手友好)
这个方法分两步走,先找出每个员工每项培训的最近日期,再关联到完整记录:
- 创建“最新培训日期”查询
- 打开Access,点击「创建」选项卡 → 选择「查询设计」
- 添加
TrainingSessions表到查询窗口 - 从表中拖入3个字段:用来关联员工的字段(比如
EmployeeID,比姓名更靠谱,避免重名)、TrainingTitle、SessionDate - 点击菜单栏里的「总计」按钮(就是那个Σ符号,会在字段行下面多出一行「总计」)
- 把
SessionDate对应的「总计」改成最大值,另外两个字段的「总计」保持分组 - 保存这个查询,比如命名为
qry_LatestTrainingDates
- 创建最终查询,关联员工信息和最新记录
- 新建一个查询设计,添加
Employees表、刚才的qry_LatestTrainingDates,还有TrainingSessions表 - 建立关联:
Employees的EmployeeID→qry_LatestTrainingDates的EmployeeIDqry_LatestTrainingDates的TrainingTitle→TrainingSessions的TrainingTitleqry_LatestTrainingDates的MaxOfSessionDate→TrainingSessions的SessionDate
- 从
Employees拖入LastName、FirstName;从TrainingSessions拖入TrainingTitle、SessionDate - 最后添加你的到期日期计算:在字段行的空白处输入表达式,比如
ExpiryDate: DateAdd("yyyy",1,[SessionDate])(这里是培训后1年到期,你可以改成自己需要的计算规则) - 运行查询,就能看到每个员工每项培训的最近记录啦!
- 新建一个查询设计,添加
方法二:直接用SQL语句(适合想快速上手代码的同学)
如果不想一步步点鼠标,也可以直接写SQL代码,把下面的内容复制到SQL视图里(注意替换成你实际的字段名,比如如果不用EmployeeID关联,就改成你用的字段):
SELECT e.LastName, e.FirstName, ts.TrainingTitle, ts.SessionDate, -- 替换成你的到期日期计算表达式,示例为培训后1年到期 DateAdd("yyyy", 1, ts.SessionDate) AS ExpiryDate FROM Employees e INNER JOIN TrainingSessions ts ON e.EmployeeID = ts.EmployeeID INNER JOIN ( -- 子查询:找出每个员工每项培训的最近完成日期 SELECT EmployeeID, TrainingTitle, MAX(SessionDate) AS LatestSessionDate FROM TrainingSessions GROUP BY EmployeeID, TrainingTitle ) latest ON ts.EmployeeID = latest.EmployeeID AND ts.TrainingTitle = latest.TrainingTitle AND ts.SessionDate = latest.LatestSessionDate;
代码解释:
- 子查询
latest先算出每个员工(EmployeeID)每项培训(TrainingTitle)的最近日期(MAX(SessionDate)) - 然后把主表和这个子查询关联,只保留日期匹配的记录,这样就过滤掉了旧的培训记录
小提醒
- 尽量用唯一的员工ID(比如
EmployeeID)关联表,不要只用姓名,避免重名员工的记录混乱 - 如果你的
TrainingTitle是存在Trainings表而不是TrainingSessions里,只要把TrainingSessions和Trainings通过TrainingID关联,提取Trainings.TrainingTitle就行,逻辑是一样的
内容的提问来源于stack exchange,提问作者Ben H.
相关产品推荐
相关产品推荐

