最近工作中遇到用关联的数据库查询出两条重复的数据,导致统计数据时有偏差,所以就想着写篇文章记录一下,并供遇到同样问题的小伙伴参考
示例sql:
select a.* from corp_info a left join corp_org b on a.org_no =b.org_no and a.stat=b.stat where a.stat='1'
核心原因:左表 A 一条数据,右表 B 匹配出多条记录,LEFT JOIN 会把左表这条数据复制多份,对应右表多条数据,最终出现重复行。
其他原因:表本身存在重复的脏数据,关联条件写漏字段导致匹配范围放大
快速排查**:**
select a.org_no,count(b.org_no) cnt from corp_info a left join corp_org b on a.org_no =b.org_no and a.stat=b.stat
where a.stat='1' group by a.org_no having cnt>1;
查询出有cnt>1的记录,就是重复数据的源头.
解决方案
1:先对右表去重再关联
先把右表分组/去重,再left join
SELECT a.*, b.* FROM table_a a LEFT JOIN ( SELECT DISTINCT b.id FROM table_b ) b ON a.id = b.id;
2:使用 DISTINCT 全局去重(简单,数据量大性能会变差)
SELECT DISTINCT a.*, b.* FROM table_a a LEFT JOIN table_b b ON a.id = b.a_id;
3:修正关联条件
检查 `ON` 后面条件是否缺少限定字段,比如只写了用户id,没加状态、时间筛选,导致匹配过多数据:
错误:`ON a.uid = b.uid`
优化:`ON a.uid = b.uid AND b.status=1`
补充:
INNER JOIN 也会重复:同样是右表多条匹配导致
RIGHT JOIN 重复:左表一对多匹配右表单条
FULL JOIN 两边都可能出现重复