left join出现重复数据解决方法

三表链接查询发现返回的结果成倍的返回,感到异常的郁闷,用的是left join,之前有大佬告诉我,left join的效率会比其他的连接方法效率要高些,所以也一直用这个。

捡重点说,总之引发查询出重复数据就是因为,表之间关联的关系不是一对一的,可能是一对多的所以会把那张多的表数据也就查询出来,导致数据重复。

解决方法:group by 字段

详解请看这篇文章:https://blog.youkuaiyun.com/ZYC88888/article/details/83002882

### 原因分析 在使用 Oracle 数据库进行 `LEFT JOIN` 操作时,查询结果中出现重复数据的根本原因在于左之间的关系类型。当左的一条记录对应的多条记录时(即 1 对多关系),为了匹配左的每一条记录,会返回多条数据。这会导致最终的结果集中左的数据重复出现,以确保所有的相关记录都被正确关联[^3]。 例如,在引用 [1] 中提到的情况中,左 `yyjg_corp_info` 中的一条记录可能对应 `YYJG_DATAMARK_INFO` 中的多个 `DATAMARK_NAME`。如果没有适当的聚合处理,直接进行 `LEFT JOIN` 将导致左的记录被重复显示多次,每次对应中的一个不同 `DATAMARK_NAME`[^1]。 ### 解决方法 #### 方法一:使用聚合函数 如果需要将中的多条记录合并为一条记录返回,可以使用聚合函数来实现。例如,可以使用 `LISTAGG` 函数将多个 `DATAMARK_NAME` 合并为一个字段,从而避免重复记录: ```sql SELECT s.id, s.corp_level, d.DATAMARK_NAME FROM yyjg_corp_info s LEFT JOIN ( SELECT BUSINESS_ID, LISTAGG(DATAMARK_NAME, ',') WITHIN GROUP (ORDER BY BUSINESS_ID) AS DATAMARK_NAME FROM YYJG_DATAMARK_INFO GROUP BY BUSINESS_ID ) d ON s.ID = d.BUSINESS_ID; ``` 此方法通过将中多个 `DATAMARK_NAME` 值合并为一个字符串,确保了左的每条记录只返回一次,从而避免了重复问题[^1]。 #### 方法二:使用 `DISTINCT` 如果中存在重复记录,可以通过在子查询中使用 `DISTINCT` 来去除重复值,然后再进行 `LEFT JOIN`。这样可以减少返回的记录数,从而避免左记录的重复: ```sql SELECT s.id, s.corp_level, d.DATAMARK_NAME FROM yyjg_corp_info s LEFT JOIN ( SELECT DISTINCT BUSINESS_ID, DATAMARK_NAME FROM YYJG_DATAMARK_INFO ) d ON s.ID = d.BUSINESS_ID; ``` 此方法通过 `DISTINCT` 关键字确保中每个 `BUSINESS_ID` 只对应唯一的 `DATAMARK_NAME`,从而减少重复记录的数量[^2]。 #### 方法三:分步查询或使用临时 对于复杂的查询场景,可以考虑将查询拆分为多个步骤,先对进行预处理,生成一个中间结果集,再与左进行连接。这种方式可以更好地控制数据的完整性与准确性,尤其是在涉及多个或多条件的情况下。 ### 总结 Oracle 中 `LEFT JOIN` 导致查询结果出现重复数据的主要原因是左之间的 1 对多关系。解决该问题的方法包括使用聚合函数、去重操作以及分步查询等技术手段。选择合适的方法取决于具体的业务需求和数据结构特点。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值