数据去重的几种实现形式

数据重复问题

对数据库进行操作,得到的结果有重复值,这是个不可避免的问题。从源头上分析,分两种情况:一是用户执行了sql语句,此时得到的结果就已经包含重复值;另一种就是返回的对象是执行多条sql语句后得到了,每条sql语句返回的对象没有重复值,但彼此之间存在重复现象,此时进行汇总操作就会出现重复值的情况。

  • 执行sql后返回的结果包含重复值

例如如下一段代码

    SELECT  DISTINCT  mti.*
    FROM m_table mti
   。。。。。(一些连接查询语句)。。。。
    WHERE sur.user_id=#{userId}

涉及了多表查询,用户表、用户—角色表、角色—表信息表、表信息表
通过当前的用户id拿到用户的角色列表,再对照角色-表信息表,拿到相应的表id,最后去表信息表中拿到用户对应表的详细信息。其中用户-角色表是一对多关系,角色-表信息表是多对多关系。

出现重复的原因:因为角色-表信息表是多对多的关系映射表,所以可能多个角色映射的表信息中存在重复值,通过用户id去得到最终的表详细信息时,就会有重复值,而用户并不需要查看重复的。最后给用户展现的应该是去掉重复值之后的最大集合结果

解决办法:distinct字段可以是在数据库层面上去重,如上代码块所示,select distinct 就会把最后的结果去重后再返回,解决了查询后出现重复值的问题。

  • 多个List集合彼此之间包含重复值

出现重复的原因:有时候会存在要执行多条sql查询语句,其中每条语句返回的list结果都不包含重复值,但是多个list结果彼此间可能存在重复值,这时我们就需要对list集合结果进行去重合并了。

解决办法:1、set集合默认是不能添加重复值的,用set集合去接收就能解决了。
2、list集合中就已经实现了去重的API,我们直接使用就好了。如下所示:

    List<Table> a = 。。。;
    List<Table> b= 。。。;
    a.removeAll(b);
    a.addAll(b);

首先调用removeAll方法,将a其中与b重复的Table对象全部移除,再调用addAll方法,将b中对象添加到a集合当中,实现去重合并。

猜你喜欢

转载自blog.csdn.net/qq_38023253/article/details/78491261
今日推荐