sql server sql中使用LEFT JOIN 查詢後數據重複

問題的起因


這個問題源於一個前幾天的新開發的任務,原本很簡單的需求,只是在原有基礎上新增一個字段的展示;看了原來的代碼,發現這個需要在原有的sql上新增加兩個表的查詢;果斷使用left join 將數據查出來了;自測通過了直接提測了;昨天晚上快下班的時候,測試提出了一個問題,說搜索單個單個數據的時候出現了重複數據。

問題的排查


既然出現問題了,就排查唄,debugger了代碼,發現不是數據轉換的問題,發現sql查詢後真的會出現重複數據;
blockchain
然後自己嘗試把自己新增的sql刪除了,果然重複的數據消失了;看來就是自己新增的數據查詢出現的問題;
然後開始根據表去查詢,發現沒問題呀,但是查詢到我使用left join新增的第二張表的時候發現了問題;
一個id對應了兩個數據,並不是完整的1:1,而是變成了1:n;
然後我就開始在網上查詢這個問題的解決方案,看了很多,基本介紹的都很統一,模板也都是一套,那就是新建一個表;
然後往表裏面插入數據,然後自己寫一個left join了一個表,然後查詢;

就目前網絡上的解決方案,
1.使用DISTINCT函數,親測沒效果,至少是在我這邊沒什麼效果;
2.使用group by 進行分組,可能是我使用的不完美,所以還是有問題,還報錯,沒辦法查詢;
後來我還特別使用google了一下,發現搜索出來類似的問題很少;也少有解決方案;

問題的解決


就這樣我晚上嘗試了多種方式沒有解決問題就下班了,今天上午繼續在網上找解決方案,也沒有找到什麼特別好的,不過突然看到了有一個人在相似的問題下
說了一個子查詢;剩下什麼都沒說,我覺得還是嘗試一下,然後就改了我新增的那段sql不使用left join而是將兩個表使用一個left join 然後裏面使用子查詢,查詢數據庫後竟然可以,而且很好用;直接就消除了重複數據;
blockchain

問題的總結


這個問題的主要原因還是因爲對於left join的機制並不是完全的理解,其實這個
1.left join 就是以左側的記錄爲主根基,右側的數據有的話就會展示,沒有的話就會變成null,是一種比較簡便的表關聯方式;
2.right join 顧名思義就是已右側的數據爲主根基,左側的數據有的話就會展示,沒有的話就是展示null;

結尾的sql展示


1.之前的查詢出重複數據的sql–只放出我新增的sql – 涉及具體的表明就直接簡化展示了

    LEFT JOIN Test1(NOLOCK) d ON a.ID = d.ID   
    LEFT JOIN Test2(NOLOCK) e ON d.MIPID = e.MIPID 
    AND e.Status in (2,5) AND
    e.No <> '' and e.No IS NOT NULL  

2.更改爲子查詢之後的正確sql

    LEFT JOIN (
	SELECT MIO.ID,MIP.Type FROM Test1(NOLOCK) AS MIO,Test2(NOLOCK) AS MIP
	WHERE MIO.MIPID = MIP.MIPID 
	AND MIP.Status in (2,5) AND MIP.No <> '' 
	AND MIP.No IS NOT NULL
	) e ON a.ID = e.ID  

更改後只不過將兩個表內部的查詢方式放在子查詢裏面,然後與外部的查詢還是需要在on裏面;
這樣就可以消除重複數據了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章