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
相关产品推荐
相关产品推荐

