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