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

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

相关推荐
Csvn17 小时前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_18 小时前
MySQL SQL 调优完整指南
数据库·sql·mysql
我命由我1234521 小时前
SQLite 数据库参数数量超限导致的崩溃问题:SQLiteException: too many SQL variables
java·数据库·sql·java-ee·sqlite·android-studio·android runtime
Lethehong1 天前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文
阿里云大数据AI技术1 天前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
jnrjian2 天前
psql 执行多个 sql 文件
数据库·sql
long3162 天前
PostgreSQL 学习资料大全:从入门到精通
java·数据库·sql·postgresql
阳光九叶草LXGZXJ2 天前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习
染指11102 天前
72.高级RAG-sql检索器
python·sql·mysql·llama·llamaindex·高级rag
long3162 天前
PostgreSQL 学习资料 · 入门 / 练习 / 精通 / 扩展
java·数据结构·数据库·spring boot·sql·postgresql·数据库开发