sql语句中IN()的使用经验

来源:互联网 发布:高中软件 编辑:程序博客网 时间:2024/06/03 02:16

前言:在开发中,我们为了提高程序性能,往往会采用批量查询操作,这时候就会想到sql中使用IN()来查询,

但是这里有个坑我分享出来,希望大家用这个的时候注意一下,以免出错.

 

目录: 1.需求

         2.场景再现

         3.自己的解决方案

         4.猜测的解决方案

         5.小结

 

1.需求

数据库中有两张表,员工表 t_emp 和部门表 t_dep ,如图,现在需要获取 id 为 3,2,1 的员工所在的部门

如果用for循环来遍历查找,肯定不会出错的,但是数据量大的时候大家会用 IN 来进行批量查找,那么问题就出现了


2.场景再现

从输出结果可以看到,这个结果跟我们想象中的正确答案是不一样的,无论怎么变化 userIds 中的 id 顺序,查到的 depNames 集合

中的顺序始终是开发一部,开发二部,开发三部,与我们传入的用户id的顺序是无关的,这就是问题所在.

在开发中,别的系统往往会传给我们一个 id 集合,我们会根据这个 id 集合,在自己的系统中从不同的表中拼凑出他们需要的数据进行返回,

那么坑就来了,很容易发生上述情况,拼接出的数据信息并不是这个id对应的真是信息.下面谈一下我自己处理这个问题的方法.

 

3.自己的解决方案

我把查询结果封装在map集合中,拿到这是map集合中对应的 key 和 value 肯定是对应的,拿到map之后,在业务层遍历取出信息再根据需求进行重封装

 

4.猜测的解决方案

在一次技术分享中,我提出这个问题,想问大家有什么更好的解决方案没,因为我并不认为上述自己的解决方案是最优的,反而显得有点low,不优雅.

顾总给了一个方法,先用 order by 把传入的 id 集合排下序.

我自己有在很多表中进行测试,发现还真的没出问题,但是这里排序需要 id 从小到大的顺序.

虽然测试很多次都没出错,但是在实际开发中我还是一直没敢用这个方法,因为不明白原理,感觉很虚,再一个就是先要排序,略显麻烦.

 

5.小结

我在网上找过资料,想去找找根本原因,但是很遗憾没找到,之后弄清楚楚之后还会分享出来,看到这里的大牛们,有谁了解的分享出来!


0 0
原创粉丝点击