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

Access中如何合并Planned与Completed查询以获取预期结果?

解决Access中合并计划/完成培训数据的问题

你遇到的多余行问题,是因为UNION ALL会保留左右连接中重复的交集行(同时存在计划和完成记录的员工-培训组合会被返回两次)。下面提供两种更可靠的解决方案:

方法一:先获取所有唯一员工-培训组合(推荐)

先提取两个查询中所有不重复的EmployeId+TrainingId组合,再分别左连接两个查询,确保每个组合只出现一次,对应字段无数据则显示空(Access中为Null,可按需转成空字符串)。

SELECT 
    base.EmployeId,
    base.TrainingId,
    -- 用Nz函数可将Null转为空字符串,按需选择
    Nz(p.[Planned Hours], "") AS [Planned Hours],
    Nz(c.[Completed Hours], "") AS [Completed Hours]
FROM 
    (
        -- 子查询获取所有存在的员工-培训组合(去重)
        SELECT EmployeId, TrainingId FROM [Qry-Planned]
        UNION
        SELECT EmployeId, TrainingId FROM [Qry-Completed]
    ) AS base
-- 左连接计划数据
LEFT JOIN [Qry-Planned] p 
    ON base.EmployeId = p.EmployeId AND base.TrainingId = p.TrainingId
-- 左连接完成数据
LEFT JOIN [Qry-Completed] c 
    ON base.EmployeId = c.EmployeId AND base.TrainingId = c.TrainingId;

方法二:用UNION替代UNION ALL去重

将原语句的UNION ALL改为UNION,利用UNION自动去重的特性,消除左右连接产生的重复交集行。同时建议明确指定字段,避免SELECT *带来的列重复问题:

SELECT 
    c.EmployeId,
    c.TrainingId,
    p.[Planned Hours],
    c.[Completed Hours]
FROM [Qry-Completed] c
LEFT JOIN [Qry-Planned] p 
    ON c.EmployeId = p.EmployeId AND c.TrainingId = p.TrainingId
UNION
SELECT 
    p.EmployeId,
    p.TrainingId,
    p.[Planned Hours],
    c.[Completed Hours]
FROM [Qry-Completed] c
RIGHT JOIN [Qry-Planned] p 
    ON c.EmployeId = p.EmployeId AND c.TrainingId = p.TrainingId;

关键说明

  • 原方案的问题:LEFT JOIN会返回所有完成记录(含匹配的计划记录),RIGHT JOIN会返回所有计划记录(含匹配的完成记录),UNION ALL会保留两者的重复交集行,导致数据冗余。
  • 方法一的优势:逻辑更清晰,避免连接顺序带来的歧义,且更容易扩展后续需求。

内容的提问来源于stack exchange,提问作者st_user_321122

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:17:14