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

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

相关推荐
动力 continue4 小时前
MySQL 基础篇 · SELECT 查询大
数据库·sql·mysql·select
先吃饱再说7 小时前
后端开发绕不开的 SQL:从建表、查询到索引优化,一篇讲透
数据库·后端·sql
陈年老古董9 小时前
Shell 脚本编程基础完整学习笔记
linux·sql·mysql
冰暮流星11 小时前
MySQL 流程函数详解
数据库·sql·mysql
起名真的太难了12 小时前
Mysql的数据类型,查询与备份操作
数据库·sql·mysql
circuitsosk16 小时前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
好好学习的星熊1 天前
SQL 面试题(数据分析师)
sql·mysql
润乾软件1 天前
CodeBuddy+SQLazy 编写复杂 SQL 详解
数据库·sql·codebuddy·sqlazy
kisshyshy1 天前
掘金同款社区数据库设计:9张表带你吃透建表、索引与约束
后端·sql·markdown