多表关联SQL查询问题:关联3张表获取员工最新培训记录
员工-岗位对应培训项目及最新记录的SQL实现方案
核心思路
先通过窗口函数筛选出每个员工每项培训的最新记录,再将员工表与对应岗位的培训表关联,最后左连接最新培训记录,确保所有员工-岗位培训组合都被保留,无记录时返回NA。
完整SQL代码
-- 筛选每个员工每项培训的最新记录 WITH Latest_Training_Records AS ( SELECT Employee_ID, Training_ID, Training_Date, Training_Score, -- 按员工+培训项目分组,按日期倒序排序,取第一条(最新) ROW_NUMBER() OVER (PARTITION BY Employee_ID, Training_ID ORDER BY Training_Date DESC) AS record_rank FROM Training_Record ) -- 关联三张表,输出所有员工-岗位培训组合及最新记录 SELECT ed.Employee_ID, ed.Employee_Name, ed.Job_Position, tl.Training_ID, tl.Training_Name, -- 无记录时返回NA,日期类型需转字符串避免类型冲突 COALESCE(CAST(ltr.Training_Date AS VARCHAR), 'NA') AS Latest_Training_Date, COALESCE(CAST(ltr.Training_Score AS VARCHAR), 'NA') AS Latest_Training_Score FROM Employee_Data ed -- 关联员工岗位对应的培训项目,确保只获取该岗位要求的培训 JOIN Training_List tl ON ed.Job_Position = tl.Required_Position -- 左连接最新培训记录,保留无记录的组合 LEFT JOIN Latest_Training_Records ltr ON ed.Employee_ID = ltr.Employee_ID AND tl.Training_ID = ltr.Training_ID -- 只保留最新记录或无记录的情况 WHERE ltr.record_rank = 1 OR ltr.record_rank IS NULL ORDER BY ed.Employee_ID, tl.Training_ID;
常见错误修正点
- 字段拼写错误:检查
Employee_ID、Training_ID、Job_Position等关联字段的拼写,必须与表结构完全一致,否则会导致关联失效。 - 关联条件错误:
- 必须通过
Job_Position关联Employee_Data和Training_List,否则会错误获取所有培训项目而非员工岗位对应的。 - 必须用
LEFT JOIN关联培训记录,若使用INNER JOIN会丢失无培训记录的员工-培训组合。
- 必须通过
- 最新记录获取错误:不能直接用
MAX(Training_Date)搭配Training_Score,无法保证分数与最新日期匹配;使用窗口函数ROW_NUMBER()是最可靠的方式。
内容的提问来源于stack exchange,提问作者NTerrys
相关产品推荐
相关产品推荐

