数据库关联表查询出重复数据的原因分析与解决

最近工作中遇到用关联的数据库查询出两条重复的数据,导致统计数据时有偏差,所以就想着写篇文章记录一下,并供遇到同样问题的小伙伴参考
示例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 两边都可能出现重复

相关推荐
Devlive 开源社区1 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
chatexcel4 小时前
不用写 SQL,如何用AI直连数据库生成可刷新的数据看板?ChatExcel的一种实践
大数据·数据库·人工智能·sql·数据分析·excel
峥无5 小时前
SQL性能调优:从执行计划看懂索引的使用与失效
数据库·sql
凤山老林6 小时前
ORM 框架性能调优:Spring Boot 下 N+1 查询根因治理、动态 SQL 优化与 Fetch 策略实战
数据库·spring boot·sql
神秘的MT7 小时前
SQL Server 分页查询 ROW_NUMBER () OFFSET...FETCH游标(Cursor) 数据插入
数据库·sql·学习·c#·winform
weixin_307779138 小时前
Python Pandas读取Excel Sheet生成SQL WHERE条件
python·sql·自动化·excel·pandas
味悲9 小时前
SQL注入从入门到实战
数据库·sql·安全
龙仔72521 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
Csvn1 天前
📊 SQL 入门 Day 2:排序与去重 — 让数据有序呈现
sql