1. 程式人生 > >資料去重的幾種實現形式

資料去重的幾種實現形式

資料重複問題

對資料庫進行操作,得到的結果有重複值,這是個不可避免的問題。從源頭上分析,分兩種情況:一是使用者執行了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集合當中,實現去重合並。