在oracle中,使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。
分割SQL语句为select a from b where c in(,) or c in (,) or c in (,),…
或者
select *
from table
where id in (1, 2, .. ., 1000)
union all
select *
from table
where id in (1001, .... ., 1999)
保证每个括号内个数不超过一千,就可以。执行效率可能比较低下。
思络:即把in条件,拼接成元组的形式,如id in (1,2,3),改为 (1,id) in((1,1),(1,2),(1,3))即可。
如果IN里面的数据是从别的表取的话,可以直接这样编写sql语句
select * from table_1 where column_1 in ( select column_2 from table_2 ,… )
建立一个中间的temp表存在查询条件,在数据库内部进行直接查询
select * from table_1 where column_1 in ( select column_2 from table_2_temp )
ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。
1)ON COMMIT DELETE ROWS
它是临时表的默认参数,表示临时表中的数据仅在事务过程(Transaction)中有效,当事务提交(COMMIT)后,临时表的暂时段将被自动截断(TRUNCATE),但是临时表的结构 以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
2)ON COMMIT PRESERVE ROWS
它表示临时表的内容可以跨事务而存在,不过,当该会话结束时,临时表的暂时段将随着会话的结束而被丢弃,临时表中的数据自然也就随之丢弃。但是临时表的结构以及元数据还存储在用户的数据字典中。如果临时表完成它的使命后,最好删除临时表,否则数据库会残留很多临时表的表结构和元数据。
create global temporary table t_test_temp (id varchar(20)) on commit preserve rows;
insert into t_test_temp VALUES('test0001');
SELECT * FROM t_test_name v WHERE EXISTS (
SELECT 1 FROM (select NAME from t_test a WHERE EXISTS (
select 1 from t_test_temp t WHERE a.id = t.id))b WHERE v.NAME=b.NAME)
参考:
https://blog.csdn.net/xiaomgee/article/details/83276693
https://www.cnblogs.com/hankuikui/p/11414494.html
https://my.oschina.net/6tao/blog/388495