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下的部门名和职责。 因为我们前端页面需要的字段就是学号,姓名,就行对应的部门名和职责。