有没有解决办法ORA-01795:列表中的expression式的最大数量是1000错误?

有没有解决方法

'ORA-01795: maximum number of expressions in a list is 1000 error'

我有一个查询,它是根据一个字段的值select字段。 我使用的是in子句,有10000多个值

例:

 select field1, field2, field3 from table1 where name in ( 'value1', 'value2', ... 'value10000+' ); 

每次执行查询时,我都会得到ORA-01795: maximum number of expressions in a list is 1000 error 。 我试图在TOAD中执行查询,没有区别,相同的错误。 我将如何修改查询来使其工作?

提前致谢

    只需使用多个in-clause来解决这个问题:

     select field1, field2, field3 from table1 where name in ('value1', 'value2', ..., 'value999') or name in ('value1000', ..., 'value1999') or ...; 

    最近我遇到了这个问题,想出了一个厚颜无耻的方式来做这件事,而没有将其他IN子句串联在一起

    你可以使用元组

     SELECT field1, field2, field3 FROM table1 WHERE (1, name) IN ((1, value1), (1, value2), (1, value3),.....(1, value5000)); 

    Oracle确实允许超过1000个元组,但不是简单的值。 更多关于这里,

    https://community.oracle.com/message/3515498#3515498

    https://community.oracle.com/thread/958612

    当然,如果你没有在IN中使用子查询的选项来从临时表中获取你需要的值。

    一些解决方法是:

    1-将IN子句拆分为文字小于1000的多个IN子句,并使用OR子句进行组合:

    将原来的“WHERE”子句从一个“IN”条件拆分成几个“IN”条件:

     Select id from x where id in (1, 2, ..., 1000,…,1500); 

    至:

     Select id from x where id in (1, 2, ..., 999) OR id in (1000,...,1500); 

    2-使用元组:1000的限制适用于单个项目的集合:(x)IN((1),(2),(3),…)。 (x,0)IN((1,0),(2,0),(3,0),…):没有限制,

     Select id from x where (x.id, 0) IN ((1, 0), (2, 0), (3, 0),.....(n, 0)); 

    3-使用临时表格:

     Select id from x where id in (select id from <temporary-table>); 

    请使用in clause中的内部查询:

     select col1, col2, col3... from table1 where id in (select id from table2 where conditions...) 

    还有一种方法:

     CREATE OR REPLACE TYPE TYPE_TABLE_OF_VARCHAR2 AS TABLE OF VARCHAR(100); -- ... SELECT field1, field2, field3 FROM table1 WHERE name IN ( SELECT * FROM table (SELECT CAST(? AS TYPE_TABLE_OF_VARCHAR2) FROM dual) ); 

    我不认为这是最佳的,但它的工作原理。 提示/*+ CARDINALITY(...) */将非常有用,因为Oracle不理解传递的数组的基数,也无法估计最佳执行计划。

    作为另一种select – 批量插入到临时表中并使用IN谓词的子查询中的最后一个。

    还有另一种解决这个问题的方法。 可以说你有两个表格Table1和Table2。 并且需要使用Criteria查询来获取表2中未提及/存在的Table1的所有条目。 所以继续这样下去…

     List list=new ArrayList(); Criteria cr=session.createCriteria(Table1.class); cr.add(Restrictions.sqlRestriction("this_.id not in (select t2.t1_id from Table2 t2 )")); . . 

    。 。 。 它将直接在SQL中执行所有的子查询function,而不包括由Hibernate框架转换的SQL中的1000个或更多的参数。 它为我工作。 注意:您可能需要根据您的要求更改SQL部分。

    我意识到这是一个老问题,指的是TOAD,但是如果你需要用c#编写代码,你可以通过for循环来分割列表。 你可以使用subList()实现与Java相同的function。

      List<Address> allAddresses = GetAllAddresses(); List<Employee> employees = GetAllEmployees(); // count > 1000 List<Address> addresses = new List<Address>(); for (int i = 0; i < employees.Count; i += 1000) { int count = ((employees.Count - i) < 1000) ? (employees.Count - i) - 1 : 1000; var query = (from address in allAddresses where employees.GetRange(i, count).Contains(address.EmployeeId) && address.State == "UT" select address).ToList(); addresses.AddRange(query); } 

    希望这有助于某人。

    运营商联盟

     select * from tableA where tableA.Field1 in (1,2,...999) union select * from tableA where tableA.Field1 in (1000,1001,...1999) union select * from tableA where tableA.Field1 in (2000,2001,...2999)