sqlserversql中使⽤LEFTJOIN查询后数据重复
问题的起因
这个问题源于⼀个前⼏天的新开发的任务,原本很简单的需求,只是在原有基础上新增⼀个的展⽰;看了原来的代码,发现这个需要在原有的sql上新增加两个表的查询;果断使⽤left join 将数据查出来了;⾃测通过了直接提测了;昨天晚上快下班的时候,测试提出了⼀个问题,说搜索单个单个数据的时候出现了重复数据。
问题的排查
既然出现问题了,就排查呗,debugger了代码,发现不是数据转换的问题,发现查询后真的会出现重复数据;
然后⾃⼰尝试把⾃⼰新增的sql删除了,果然重复的数据消失了;看来就是⾃⼰新增的数据查询出现的问题;
然后开始根据表去查询,发现没问题呀,但是查询到我使⽤left 新增的第⼆张表的时候发现了问题;
⼀个id对应了两个数据,并不是完整的1:1,⽽是变成了1:n;
然后我就开始在⽹上查询这个问题的解决⽅案,看了很多,基本介绍的都很统⼀,模板也都是⼀套,那就是新建⼀个表;
然后往表⾥⾯插⼊数据,然后⾃⼰写⼀个left join了⼀个表,然后查询;
就⽬前⽹络上的解决⽅案,
1.使⽤DISTINCT函数,亲测没效果,⾄少是在我这边没什么效果;
2.使⽤group by 进⾏分组,可能是我使⽤的不完美,所以还是有问题,还报错,没办法查询;
后来我还特别使⽤google了⼀下,发现搜索出来类似的问题很少;也少有解决⽅案;
问题的解决
就这样我晚上尝试了多种⽅式没有解决问题就下班了,今天上午继续在⽹上解决⽅案,也没有到什么特别好的,不过突然看到了有⼀个⼈在相似的问题下
说了⼀个⼦查询;剩下什么都没说,我觉得还是尝试⼀下,然后就改了我新增的那段sql不使⽤left join⽽是将两个表使⽤⼀个left join 然后⾥⾯使⽤⼦查询,查询数据库后竟然可以,⽽且很好⽤;直接就消除了重复数据;
问题的总结
这个问题的主要原因还是因为对于left join的机制并不是完全的理解,其实这个
1.left join 就是以左侧的记录为主根基,右侧的数据有的话就会展⽰,没有的话就会变成null,是⼀种⽐较简便的表关联⽅式;
2.right join 顾名思义就是已右侧的数据为主根基,左侧的数据有的话就会展⽰,没有的话就是展⽰null;
结尾的sql 展⽰
1.之前的查询出重复数据的sql–只放出我新增的sql – 涉及具体的表明就直接简化展⽰了
2.更改为⼦查询之后的正确sql
更改后只不过将两个表内部的查询⽅式放在⼦查询⾥⾯,然后与外部的查询还是需要在on⾥⾯;
这样就可以消除重复数据了。 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
1
2
sql left join 多表连接3
4 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
1
2
3
4
5
6
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论