You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:38:19