Oracle中IN参数个数超过1000的解决方案,求大神指教!

wtmanutd 2014-10-30 10:53:12
在oracle中,使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出“java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000”这个异常。比如执行select * from table where id in (1, 2, ..., 1000, 1001, .....,1999)时。
在网上搜了一下,解决方案都是将参数分段,即select * from table where id in (1, 2, ..., 1000) or id in(1001, ....., 1999)。
但是这种方式感觉效率太低,当参数特别多的时候可能非常慢。
请教各位大神,有没有其他的解决方案可以解决这个问题?
...全文
19748 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtmanutd 2014-10-31
  • 打赏
  • 举报
回复
引用 12 楼 bw555 的回复:
[quote=引用 9 楼 wtmanutd 的回复:] 先感谢一下楼上各位!确实可以用这种方式解决 再请教一下,怎么插入临时表效率更高?一条一条插肯定是很慢的
插入的话本身应该是很快的,虽然条数很多,但是时间也不会很长 如果还嫌慢的话可以插入是加上append参数,这样不用写日志,直接写入数据库 insert /*+append*/ into [/quote] 感谢版主解答,现在基本解决问题了
bw555 2014-10-31
  • 打赏
  • 举报
回复
引用 9 楼 wtmanutd 的回复:
先感谢一下楼上各位!确实可以用这种方式解决 再请教一下,怎么插入临时表效率更高?一条一条插肯定是很慢的
插入的话本身应该是很快的,虽然条数很多,但是时间也不会很长 如果还嫌慢的话可以插入是加上append参数,这样不用写日志,直接写入数据库 insert /*+append*/ into
bw555 2014-10-31
  • 打赏
  • 举报
回复
引用 10 楼 u010004909 的回复:
[quote=引用 3 楼 bw555 的回复:]
select *
  from table
 where id in (
select 1 from dual
union all
select 2 from dual
 ……)
这么写没个数限制 不过还是建议建临时表,把in里面的数据插入到临时表中,然后用临时表写条件查询
版主刚教给我的,应该就是这样用,效率高! "select 1 from"[/quote] 他的问题和你那个可不一样,他这个是业务数据
糖水 2014-10-31
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
select *
  from table
 where id in (
select 1 from dual
union all
select 2 from dual
 ……)
这么写没个数限制 不过还是建议建临时表,把in里面的数据插入到临时表中,然后用临时表写条件查询
版主刚教给我的,应该就是这样用,效率高! "select 1 from"
wtmanutd 2014-10-31
  • 打赏
  • 举报
回复
引用 6 楼 zlloct 的回复:
[quote=引用 5 楼 wtmanutd 的回复:] 请问临时表要怎么建呢?我是通过java 操作数据库的
就是建立一个表来存储传入参数,取数据的时候先从临时表中遍历取参数,然后再将取出的参数拿去作为条件用,[/quote]
引用 7 楼 wmxcn2000 的回复:
把这 2000 个值写到一个临时表中,直接 in 一个子查询

select * from t where id in (select id from temp)

引用 7 楼 wmxcn2000 的回复:
把这 2000 个值写到一个临时表中,直接 in 一个子查询

select * from t where id in (select id from temp)

先感谢一下楼上各位!确实可以用这种方式解决 再请教一下,怎么插入临时表效率更高?一条一条插肯定是很慢的
卖水果的net 2014-10-30
  • 打赏
  • 举报
回复
把这 2000 个值写到一个临时表中,直接 in 一个子查询

select * from t where id in (select id from temp)

CT_LXL 2014-10-30
  • 打赏
  • 举报
回复
引用 5 楼 wtmanutd 的回复:
请问临时表要怎么建呢?我是通过java 操作数据库的
就是建立一个表来存储传入参数,取数据的时候先从临时表中遍历取参数,然后再将取出的参数拿去作为条件用,
wtmanutd 2014-10-30
  • 打赏
  • 举报
回复
引用 3 楼 bw555 的回复:
select *
  from table
 where id in (
select 1 from dual
union all
select 2 from dual
 ……)
这么写没个数限制 不过还是建议建临时表,把in里面的数据插入到临时表中,然后用临时表写条件查询
请问临时表要怎么建呢?我是通过java 操作数据库的
bw555 2014-10-30
  • 打赏
  • 举报
回复
引用 2 楼 wtmanutd 的回复:
[quote=引用 1 楼 zlloct 的回复:] [quote=引用 楼主 wtmanutd 的回复:]
改SQL,参数太多了,只有想其他办法 比如: select * from table where id in (1, 2, .. ., 1000) union all select * from table where id in (1001, .... ., 1999) [/quote] 这种方式效率会比or的方式高吗? 另外,由于这种方式相当于把整个sql重复n次,如果原来的sql就很长很复杂,这种方式得到的sql岂不是还要成倍的增加?[/quote] 看索引怎么建的了,使用or的话很容易不走索引而使用全表扫描
bw555 2014-10-30
  • 打赏
  • 举报
回复
select *
  from table
 where id in (
select 1 from dual
union all
select 2 from dual
 ……)
这么写没个数限制 不过还是建议建临时表,把in里面的数据插入到临时表中,然后用临时表写条件查询
wtmanutd 2014-10-30
  • 打赏
  • 举报
回复
引用 1 楼 zlloct 的回复:
[quote=引用 楼主 wtmanutd 的回复:]
改SQL,参数太多了,只有想其他办法 比如: select * from table where id in (1, 2, .. ., 1000) union all select * from table where id in (1001, .... ., 1999) [/quote] 这种方式效率会比or的方式高吗? 另外,由于这种方式相当于把整个sql重复n次,如果原来的sql就很长很复杂,这种方式得到的sql岂不是还要成倍的增加?
CT_LXL 2014-10-30
  • 打赏
  • 举报
回复
引用 楼主 wtmanutd 的回复:
改SQL,参数太多了,只有想其他办法 比如: select * from table where id in (1, 2, .. ., 1000) union all select * from table where id in (1001, .... ., 1999)
华而不实 2014-10-30
  • 打赏
  • 举报
回复
引用 7 楼 wmxcn2000 的回复:
把这 2000 个值写到一个临时表中,直接 in 一个子查询

select * from t where id in (select id from temp)

赞同。。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧