SQL内连接查询出现重复记录,如何实现去重?
解决INNER JOIN查询结果重复的问题
首先注意你的SQL语句里有个笔误:RTU+SCAN.B1_NAME应该是RTU_SCAN.B1_NAME,这个拼写错误会导致关联逻辑出错,先修正这个基础问题。
查询结果重复48次,本质是RTU_SCAN表中存在多条与ABS_LIMIT表同一条记录匹配的B1_NAME记录,关联后每条匹配项都会被返回,因此产生重复。以下是几种去重方案:
方案1:用DISTINCT过滤完全重复记录
直接在SELECT后添加DISTINCT关键字,数据库会自动过滤掉所有字段完全相同的重复行:
SELECT DISTINCT ABS_LIMIT.B1_NAME, ABS_LIMIT.B2_NAME, ABS_LIMIT.B3_NAME, ABS_LIMIT.ELEM_NAME FROM ABS_LIMIT INNER JOIN RTU_SCAN ON RTU_SCAN.B1_NAME = ABS_LIMIT.B1_NAME WHERE ABS_LIMIT.B3_NAME LIKE 'AMP%';
方案2:用GROUP BY分组去重
如果需要后续扩展聚合操作(比如统计匹配次数),或者想明确指定分组规则,可以用GROUP BY,将SELECT中的所有非聚合字段都放入GROUP BY子句:
SELECT ABS_LIMIT.B1_NAME, ABS_LIMIT.B2_NAME, ABS_LIMIT.B3_NAME, ABS_LIMIT.ELEM_NAME FROM ABS_LIMIT INNER JOIN RTU_SCAN ON RTU_SCAN.B1_NAME = ABS_LIMIT.B1_NAME WHERE ABS_LIMIT.B3_NAME LIKE 'AMP%' GROUP BY ABS_LIMIT.B1_NAME, ABS_LIMIT.B2_NAME, ABS_LIMIT.B3_NAME, ABS_LIMIT.ELEM_NAME;
方案3:先对关联表去重再JOIN
如果RTU_SCAN表本身就存在重复的B1_NAME记录,可以先对该表做去重处理,再和ABS_LIMIT关联,从根源减少重复匹配:
SELECT ABS_LIMIT.B1_NAME, ABS_LIMIT.B2_NAME, ABS_LIMIT.B3_NAME, ABS_LIMIT.ELEM_NAME FROM ABS_LIMIT INNER JOIN (SELECT DISTINCT B1_NAME FROM RTU_SCAN) AS RTU_SCAN_UNIQUE ON RTU_SCAN_UNIQUE.B1_NAME = ABS_LIMIT.B1_NAME WHERE ABS_LIMIT.B3_NAME LIKE 'AMP%';
额外提示
如果用上述方法后仍有重复,大概率是看似相同的字段存在细微差异(比如首尾空格、大小写不一致),可以用TRIM()函数去除空格,或者用UPPER()/LOWER()统一大小写后再匹配。
内容的提问来源于stack exchange,提问作者user20061612
相关产品推荐
相关产品推荐

