Oracle 视图中出现重复记录(left join)

Oracle 视图中出现重复记录

问题

今天做项目的时候,客户反映页面中出现了重复的数据。经排查后发现前短数据新增的字段,来自于应该新的表。当时是直接使用 left join 左连接的方式对数据进行拼接的。

left join 左连接本身是不会造成重复数据的,但是如果我们左连接的条件在右边的表格中不是主键(可能重复出现),那么我们最后的数据就可能会增多。
如下图 用户表和部门表,如果我们是根据部门名让两个表进行左连接,就会出现多的记录。
用户表 left join 部门表 on 用户表.部门名 =部门表.部门名
在这里插入图片描述
在这里插入图片描述

如下就是查出来的记录:
在这里插入图片描述

这个时候如果我们的前台只需要学号,姓名,部门。那么其显示的数据对客户而言就是重复的。如下:
在这里插入图片描述

解决办法

办法1: 换左连接的条件 向上面的例子,换成用户表 left join 部门表 on 用户表.部门id =部门表.部门id 。因为部门id是唯一的主键,这样连接后肯定不会有重复的。

办法2: 有的时候前一个表中确实没有右边表中的主键字段,无法换左连接条件。
可以考虑使用 distinct 函数
SELECT DISTINCT可以用来过滤结果集中的重复行,
用户表 left join (SELECT distinct mse.部门名 FROM 部门名 mse)
我们使用 distinct 函数 先对将要进行左连接的表,根据连接条件进行筛选,如果有重复的部门名进行只保留用户。distinct筛选之后,部门的表就变成了

在这里插入图片描述

这个时候再进行左连接:

在这里插入图片描述

前端选取相应的数据就是:

在这里插入图片描述

这样就能保证前端页面数据的唯一性。

注意

方法2 使用distinct 其实就是根据我们给的条件 如:部门名,把下面部门名重复的行记录删除。因为我们上面不同部门id下的部门名和职责是一样的。所以我们只需要获取一个就行了,不用管获取到的是哪个部门id下的部门名和职责。 因为我们前端页面需要的字段就是学号,姓名,就行对应的部门名和职责。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值