oracle 使用 in 关键字查询且集合数量大小大于1000

oracle 使用 in 关键字查询且集合数量大小大于1000

Oracle MyBatis 提示:java.sql.SQLSyntaxErrorException: ORA-01795: 列表中的最大表达式数为 1000

产生原因:oracle 使用 in 关键字查询且集合数量大小大于1000

解决办法:

第一种、将集合拆分,使用or 连接。
select * from A where id in (1, 2, …, 1000) or id in (1001, …, 1999)
第二种、将集合修改为查询语句
select * from A where id in (select id from B)
第三种、与 第二种 类似,使用 with as 语法,把条件封装成一个表
with temp as (select * from B)
select * from A where id in (select id from temp)

关于SQL in查询(单次查询)和for循环查询(多次查询) 效率论证

for查询:需要循环连接数据库,不仅占用大量连接池,而且多次的网络传输更是拖慢了总体的速度。(一般做过代码分析的都知道,程序其实并不会消耗太多时间,反而是网络请求消耗的时间较多)
in查询
首先 将多次连接直接降为一次,不仅节省连接池资源,且只进行一次网络传输。
其次 就是大家在考虑的in查询的问题。不妨这么去想:对于数据库自身的优化来说,数据库本身完全可以将in查询转为多次查询,然后组合起来返回结果。-- 这类似于for查询,但是比程序中for查询节省了多次连接和多次网络传输。数据库自身起码会优化到这样,那也就不必担心其效率比for查询低了

sql in 的替代方法

表a 有20w条数据 有个主键自动增长的id ,
这时,程序传过来4000多个id,中间用,隔开,我目前查询的写法是用in(4000个id),但这中方法太慢了 我想找个快的写法,能快速的查到数据

通过函数先把id转换成表,然后用join的方法select a.* from 源表 a inner join (转换后的id表) b on a.id=b.id

原文地址:https://www.cnblogs.com/h-c-g/p/15026682.html