left join的一些问题 数据行数减少、增多 数据重复

数据行数减少

  • A表数据
aid name a_id
1 张三 1
2 李四 2
3 王二麻 3
4 周一 4
  • B表数据
bid name b_id
1 语文 1
2 数学 2
3 物理 3
4 英语 4
4 化学 5

SQL:

SELECT * 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

结论:

当where 条件在外,会先聚合后过滤,所以结果会变少

数据行数增多

  • A表数据
aid name a_id
1 张三 1
2 李四 2
3 王二麻 3
4 周一 4
  • B表数据
bid name b_id
1 语文 1
2 数学 2
3 物理 3
4 英语 4
4 化学 4

SQL:

SELECT * 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 化学 4

结论:

因为这个时候B表有重复的b_id,如果这时候计算A表值的count 或者sum ,结果会比预想的大。

虽然很简单,但是很容易犯错误

数据重复 解决方案

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

查询结果:

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 化学 4

结论:

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

查询结果:

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

你可能感兴趣的:(left join的一些问题 数据行数减少、增多 数据重复)