oracle sql in 超过1000个参数报错(ORA-01795: 列表中的最大表达式数为 1000)解决办法之一

        在oracle数据库中,sql使用in时,如果in的能数超过1000就会报出"ORA-01795: 列表中的最大表达式数为 1000/ORA-01795: maximum number of expressions in a list is 1000"的错误,这个也是生产中大家常踩的坑之一!

       在测试环境下,因为数据量小,测试时用例没有覆盖到。有些场景,大家在评估的时间会觉得正常情况下肯定不会超1000(想想墨菲定律),往往在这个时间就已经埋下了暗雷!

    网上关于ORA-01795的解决办法也有很多,比如 使用 in() or in(),创建临时表join,使用union 等等,我这里也提供一个解决办法,处理办法没有标准至于选哪种看自己的喜好和应用场景。

 

官方说:A comma-delimited list of expressions can contain no more than 1000 expressions. A comma-delimited list of sets of expressions can contain any number of sets, but each set can contain no more than 1000 expressions.

        这里使用oracle tuple( A comma-delimited list of sets of expressions) 也就是元组,语法如下:

SELECT * FROM TABLE_NAME WHERE (1, COLUMN_NAME) IN 
((1, VALUE_1), 
(1, VALUE_2), 
...
...
...
...
(1, VALUE_1000),
(1, VALUE_1001));

比如我们想要从用户表里通过用户id 查询用户信息可以这样写:

select * from t_user u where (1, u.id) in ((1, 'id001'),(1,'id002'),(1,'XXX'))

上面的语句其实等同于:select * from t_user u where (1=1 and u.id='id001') or (1=1 and u.id='id002') or (1=1 and u.id='XXX')

大家的工程多数会用ORM框架如MyBatis 我们可以借助MyBatis的foreach 原来是这写:

 WHERE u.id IN(
        <foreach collection="list" item="item" index="index" separator=",">
            #{item}
        </foreach>
        )

现在稍稍修改一下:

 WHERE (1, u.id) IN(
        <foreach collection="list" item="item" index="index" separator=",">
            (1, #{item})
        </foreach>
        )

个人建议:这个不是最好的办法,如果数据量大的情况下,还是推荐大家做分页处理,如果数据量很大的话更加推荐数据库分页,我这里也有一篇内存分页的文章,如果有需要大家可以参考:利用java8 stream api 实现List集合分页获取工具

另外这里也提醒我们的测试人员,在一些批量处理功能测试时,最好用例在设计的时候考虑大量数据处理的case!

参考文档:https://docs.oracle.com/database/121/SQLRF/expressions016.htm#SQLRF52099

                  http://dbaparadise.com/2016/07/limitations-of-the-in-clause-in-oracle-ora-01795/#3

If you run the query in the application, and you need to run it often, then definitely Tom Kyte’s solution is the best. Basically he recommends the following:

Suggest you create a global temporary table, array insert your “in list” into this table and use
select …. and ( t.e in ( select * from global_temp_table );”

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 这个 SQL 错误是因为 Oracle 数据库的 IN 子句最多只能包含 1000 个项。如果您在查询使用了超过 1000 个项,就会导致这个错误。解决这个问题的方法是将包含超过 1000 个项的 IN 子句分成多个子句,并使用 UNION 运算符将它们组合起来。或者,您也可以将数据导入到一个临时表,然后在查询使用临时表来避免出现太多的项。 ### 回答2: 这个错误是由于在SQL查询语句列表表达式数量超过了数据库限制的最大1000导致的。列出最大数量的表达式可能会给数据库的性能和资源消耗带来风险,因此数据库设置了这样的限制。 要解决这个问题,有几种方法可以考虑: 1. 减少表达式数量:检查查询语句表达式数量,看是否有冗余或无关紧要的表达式。删除不必要的表达式,以减少总数。 2. 使用子查询:如果查询表达式数量过多,可以考虑将部分表达式放到子查询。将其一部分表达式作为一个子查询,然后将其结果与主查询进行关联。 3. 使用临时表:如果查询表达式数量无法通过上述方法减少到1000以下,可以考虑使用临时表。将查询的结果存储在临时表,然后再对临时表进行进一步的查询。 4. 优化查询逻辑:检查查询语句的逻辑,看是否可以通过优化查询来减少表达式数量。例如,合并多个子查询,通过使用更有效的连接方法来简化查询。 需要注意的是,每个数据库管理系统可能有不同的最大表达式限制。如果以上方法无法解决问题,建议查阅相关数据库的文档或联系数据库管理员以获取更多帮助。 ### 回答3: SQL错误:1795,SQLState:42000 ORA-01795列表最大表达式数为1000。 这个错误是指在SQL查询列表表达式的数量超过了数据库的限制。Oracle数据库限制了一个查询语句表达式最大数量为1000个。 造成这个错误的原因可能是查询使用了过多的列或表达式,使得超过了这个限制。解决这个问题的方法可以有以下几种: 1. 减少查询的列或表达式的数量。如果查询使用了过多的列或表达式,可以考虑减少它们的数量,以使其不超过1000个。 2. 使用更简洁的查询。有时候可以通过优化查询语句,使用更简洁的方法来达到相同的效果。例如,可以使用子查询或者使用连接来替代多个列或表达式的使用。 3. 分割查询。如果查询确实需要使用很多的列或表达式,并且无法简化,可以考虑将查询分割成多个部分,分别执行。然后将结果进行合并。 总之,解决这个问题的关键是要减少查询的列或表达式的数量,或者通过其他方式来处理大量的列或表达式。同时还需注意数据库的其他限制,以确保查询的正确执行。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值