93

回避策はありますか

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

クエリがあり、1 つのフィールドの値に基づいてフィールドを選択しています。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 でクエリを実行しようとしていますが、違いはありません。同じエラーです。クエリを変更して機能させるにはどうすればよいですか?

前もって感謝します

4

14 に答える 14

137

これを回避するには、複数の節を使用してください。

select field1, field2, field3 from table1 
where  name in ('value1', 'value2', ..., 'value999') 
    or name in ('value1000', ..., 'value1999') 
    or ...;
于 2013-07-24T20:39:42.633 に答える
38

いくつかの回避策は次のとおりです。

1. IN 句を分割する

リテラルが 1000 未満の IN 句を複数の IN 句に分割し、OR 句を使用して結合します。

元の「WHERE」句を 1 つの「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)、...) の単一アイテムのセットに適用されます。セットに 2 つ以上のアイテムが含まれる場合、制限はありません: (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>);
于 2015-09-07T13:46:13.880 に答える
26

私は最近この問題に遭遇し、追加の 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 内でサブクエリを使用して一時テーブルから必要な値を取得するオプションがない場合です。

于 2014-10-06T19:52:42.507 に答える
7

in-clause内で内部クエリを使用してください。

select col1, col2, col3... from table1
 where id in (select id from table2 where conditions...)
于 2014-07-11T05:49:56.483 に答える
7

もう1つの方法:

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は渡された配列のカーディナリティを認識せず、最適な実行計画を推定できないため、ヒントは非常に役立ちます。

別の代替手段として - 一時テーブルにバッチ挿入し、最後のサブクエリをIN述語に使用します。

于 2014-09-19T16:50:23.883 に答える
3

操作組合

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)
于 2016-09-27T07:30:16.730 に答える