left join的一些問題 數(shù)據(jù)行數(shù)減少、增多 數(shù)據(jù)重復(fù)

數(shù)據(jù)行數(shù)減少

  • A表數(shù)據(jù)
aid name a_id
1 張三 1
2 李四 2
3 王二麻 3
4 周一 4
  • B表數(shù)據(jù)
bid name b_id
1 語文 1
2 數(shù)學(xué) 2
3 物理 3
4 英語 4
4 化學(xué) 5

SQL:

SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3

結(jié)果:

aid name a_id id(1) name(1) b_id
4 周一 4 4 英語 4

結(jié)論:

當where 條件在外,會先聚合后過濾,所以結(jié)果會變少

數(shù)據(jù)行數(shù)增多

  • A表數(shù)據(jù)
aid name a_id
1 張三 1
2 李四 2
3 王二麻 3
4 周一 4
  • B表數(shù)據(jù)
bid name b_id
1 語文 1
2 數(shù)學(xué) 2
3 物理 3
4 英語 4
4 化學(xué) 4

SQL:

SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3

結(jié)果:

aid name a_id id(1) name(1) b_id
4 周一 4 4 英語 4
4 周一 4 5 化學(xué) 4

結(jié)論:

因為這個時候B表有重復(fù)的b_id,如果這時候計算A表值的count 或者sum ,結(jié)果會比預(yù)想的大。

雖然很簡單,但是很容易犯錯誤

數(shù)據(jù)重復(fù) 解決方案

  • 使用distinct去重
SELECT DISTINCT a.* FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3

查詢結(jié)果:

aid name a_id
4 周一 4
SELECT DISTINCT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3
aid name a_id id(1) name(1) b_id
4 周一 4 4 英語 4
4 周一 4 5 化學(xué) 4

結(jié)論:

distinct用于多個字段時,需要這些字段都相同的時候才會達到濾重的目的。
  • 使用group by去重(推薦使用
SELECT * FROM a LEFT JOIN b ON a.a_id=b.b_id WHERE b.b_id > 3 GROUP BY a.id

查詢結(jié)果:

aid name a_id id(1) name(1) b_id
4 周一 4 4 英語 4
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容