今天在改bug的时候,碰到了一个这样的问题:
问题描述:
一共4条数据,但是是2对,也就是存在两条一模一样的数据,但是在前台进行显示的时候又要都显示出来,
这里可以看到分摊页签的4条数据,就是这样,但是由于当时不知道谁写的SQL,最后会distinct一下,这样就把相同的数据过滤掉了。
解决方案:
第一步:找到问题所在关键,前台数据显示不正确,就要去看SQL的问题,话说公司的SQL看着都想吐。看了半天定位到原来一开始写SQL的左连接,进行查询的时候,on 的条件不是右表的唯一字段,这就造成了笛卡尔积,我是没想到笛卡尔积离我这么近。这里感谢左连接出现笛卡尔积这位博主的分享。
第二步:发现了问题,出现笛卡尔积势必就要进行去重。在网上找了很多解决方案,基本都是要删除重复数据,可是我需要过滤啊,这里想到了平时用的oracle的rowID,可以distinct rowid,这样就达到了根据rowID进行过滤的需要。
第三步:问题层出不穷,第一次distinct rowID之后没有给rowID赋别名,但是原来的SQL语句查询里又有 * 这个符号,这样oracle是不允许的,所以就要给rowID赋别名。查询问题解决。
第四步:问题一波接着一波,在查询完数据进行页面回显的时候,要把每个字段赋值给实体类VO,但是这里rowID的类型又对不上,一开始以为是类型不对,讲返回类型改成double,还是不行,后来经过查找资料,发现oracle的rowID不会再java实体类里进行转换。当时我就懵圈了,这TM咋整,后来发现,oracle提供了一个将rowID转换为char类型的,这个函数就是rowidtochar(rowid)。又把SQL设计到rowID的地方使用这个函数转换了一下,至此,数据可以正确查询出来并能正确回显。
第五步:仰天长啸,好鸡儿爽。
小结一下:今天这个问题自己想了很多,为什么当时设计库表的时候没有考虑到类似的事情发生。同时每个程序员在写SQL的时候,尤其是多表连接的时候,要注意,自己的on的条件,不要想当然的就写了,多考虑考虑。是不是left join 表 A ,其中on的条件是否是表A中的唯一字段,如果不是,这样写的意义在哪里,实在避免不了,应该进行必要的去重,以防将来进行返工。
长路漫漫,只有摔过跤才会印象深刻。