专栏首页chenchenchen解决Oracle使用IN 不能超过1000问题

解决Oracle使用IN 不能超过1000问题

在oracle中,使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。

解决办法

使用or/union连接

分割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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • oracle select in超过1000条报错解决方法

    本博客介绍oracle select in超过1000条数据的解决方法,java框架是采用mybatis的,这可以说是一种比较常见的错误:select * fr...

    SmileNicky
  • 解决mysql中limit和in不能同时使用的问题

    两种方式推荐第一种。避免了in语句。进行explain诊断会发现第一种效率高很多。

    陈灬大灬海
  • elasticsearch不能使用root启动问题解决

    es安装好之后,使用root启动会报错:can not run elasticsearch as root [root@iZbp1bb2egi7w0ueys5...

    实时计算
  • 能用HTML/CSS解决的问题就不要使用JS

    为什么说能使用html/css解决的问题就不要使用JS呢?两个字,因为简单。简单就意味着更快的开发速度,更小的维护成本,同时往往具有更好的体验,下面介绍几个实例...

    用户1667431
  • Oracle 11g使用exp导出表不全的问题解决方法

    select ‘alter table ‘||table_name||’ allocate extent;’ from user_tables where nu...

    用户2134503
  • 解决oracle服务占用内存过高的问题

    通常我们在自己电脑上搭建项目环境时,都免不了要安装Oracle。不管你硬件多强悍,都会发现,Oracle服务一旦启用,内存立马吃紧。笔者内存8G,启动一个VS,...

    浩Coding
  • Oracle业务用户密码过期问题的解决

    实验环境:Oracle 11.2.0.4 如果DBA不知道业务用户密码,当业务密码过期,应用要求DBA帮忙重设为原来的密码。

    Alfred Zhao
  • MySQL异常访问的熔断机制

    网上搜了下,问题原因就是同一个IP在短时间内产生太多(超过MySQL数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞,按照...

    bisal
  • MySQL异常访问的熔断机制

    网上搜了下,问题原因就是同一个IP在短时间内产生太多(超过MySQL数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞,按照...

    bisal
  • Oracle中的PGA监控报警分析二(r12笔记第87天)

    今天又收到了一条报警的信息,看起来很常规,但是后面的故事如果你做了分析就会发现其实本身并不平常,我觉得我得出手了。之前的分析可以参考 Oracle中的PGA监控...

    jeanron100
  • fixed Oracle SQL报错 #ORA-01460: 转换请求无法实施或不合理

    最近遇到一个oracle错误,之前并没有遇到过,并不是select in超过1000个导致的,通过网上资料说是oracle版本导致,也有的说是oracle SQ...

    SmileNicky
  • 有效括号入门题:使用栈能够解决超过一半的「有效括号」问题 ...

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

    宫水三叶的刷题日记
  • where in与join 查询

    Oracle:当前所用版本中,限制in中的参数不能超过 1000个。当超出时会被报错"ORA-01795异常(where in超过1000)的解决"。

    WindCoder
  • tensorflow 使用CPU而不使用GPU的问题解决

    今天发现一个怪现象,在训练keras时,发现不使用GPU进行计算,而是采用CPU进行计算,导致计算速度很慢。

    狼啸风云
  • 给你几个硬盘,你能提供什么样的高可靠性存储解决方案?

    “给你几个硬盘,你能提供什么样的高可靠性存储解决方案?” 我们这些计算领域的工程师在面试时,常被问题这个问题。

    王录华
  • 由报警邮件分析发现的备库oracle bug(r7笔记第12天)

    昨天到公司之后,收到两份封报警邮件,可以看到在早晨6:30左右主库的v$dataguard_status检查时发现了一个错误。然后再2分钟后就自动恢复了。 一般...

    jeanron100
  • 使用tidylib解决不规则网页问题

    去http://www.paehl.com/open_source/?HTML_Tidy_for_Windows 下载LIBTIDY DLL

    hankleo
  • 使用json2.js解决IE6、7、8不能使用jQuery JSON.stringify函数的问题

    周末捣腾JSON提交数据,使用jQuery的JSON.stringify函数,使用Google Chrome浏览器、百度浏览器调试都正常,今天用户说IE和360...

    崔文远TroyCui
  • 使用过滤器解决中文乱码问题

    在Web.xml文件中,配置过滤器,其过滤器的URL映射可以使用正则表达式进行配置,如实例中使用“/*”来匹配所有请求。

    卡尔曼和玻尔兹曼谁曼

扫码关注云+社区

领取腾讯云代金券