有没有解决办法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)