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

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

相关推荐
漂着的圆木2 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量
旺仔不是程序员2 天前
LIMIT 1:PostgreSQL 只取一行的高效查询姿势
数据库·后端·sql
知识的搬运工旺仔3 天前
唯一索引与 NULL 值:PostgreSQL 主键约束与 NULLS NOT DISTINCT
数据库·后端·sql·postgresql
想念是会呼吸的鱼3 天前
【ClickHouse 常用 SQL 语句整理】
sql·clickhouse
想念是会呼吸的鱼3 天前
MySQL 常用语法整理
sql·mysql
SelectDB技术团队3 天前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
数据库·人工智能·sql·clickhouse·apache doris·selectdb·湖仓架构升级
imDwAaY3 天前
MySQL MVCC 详解:原理、版本链、Read View 与可见性判断
数据库·sql·mysql
bbq粉刷匠3 天前
触发器(下):事务与锁、binlog 一致性与替代方案
sql