Access如何实现按Number字段匹配两表并返回第一张表去重记录
Access 双表Number字段匹配无重复查询方案
问题核心原因
你之前直接用JOIN、普通WHERE子句没达到效果,核心原因是两张表的Number字段都存在重复值,直接关联时会形成多对多的匹配关系,生成M*N条冗余关联行,最终结果就会出现大量非预期重复。
可行实现方案
方案1:EXISTS匹配法(优先推荐)
该写法不会产生多对多关联的冗余行,Access兼容性好,执行效率更高:
SELECT DISTINCT a.* FROM 第一张表名 a WHERE EXISTS ( SELECT 1 FROM 第二张表名 b WHERE b.Number = a.Number );
逻辑说明:
- 逐行校验第一张表的记录,只要该记录的Number值在第二张表中存在对应匹配,就会被纳入结果集
- 外层
DISTINCT直接对第一张表的返回结果去重,就算第一张表本身存在多条同Number的重复记录,最终返回也不会有重复值 - EXISTS判断只要找到1条匹配就会终止校验,不会因为第二张表有多个同Number的重复记录生成冗余行
方案2:去重子查询关联法
如果需要明确控制关联逻辑,可以先把第二张表的Number值去重后再做关联:
SELECT DISTINCT a.* FROM 第一张表名 a INNER JOIN ( SELECT DISTINCT Number FROM 第二张表名 ) b ON a.Number = b.Number;
逻辑说明:
- 子查询先提取第二张表中所有不重复的Number值,从根源避免关联时多对多匹配的问题
- 外层
DISTINCT负责过滤第一张表本身的重复记录,最终返回无重复的匹配结果
注意事项
- 不要直接写无去重处理的两表JOIN再套DISTINCT:这种写法会先生成大量冗余关联行再去重,数据量大时性能极差
- 实际使用时把语句里的
第一张表名、第二张表名替换成你自己的真实表名即可 - 如果不需要返回表中所有字段,建议把
a.*替换成你需要的具体字段名,DISTINCT去重精度会更高
内容的提问来源于stack exchange,提问作者aldin
相关产品推荐
相关产品推荐

