3

NOT IN 句で使用したいカンマ区切りの ID があります。Oracle 11g を使用しています。

select * from table where ID NOT IN (1,2,3,4,...,1001,1002,...)

結果は

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

一時テーブルを使用したくありません。これを行うことを検討しようとしています

select * from table1 where ID NOT IN (1,2,3,4,…,1000) AND 
ID NOT IN (1001,1002,…,2000)

この問題に対する他のより良い回避策はありますか?

4

4 に答える 4

9

したくないと言っていましたが、一時テーブルを使用してください。それがここでの正しい解決策です。

Oracle でのクエリの解析にはコストがかかります。これは、何千もの識別子を SQL の巨大な塊に入れるときに得られるものです。また、ヒットしようとしているクエリの長​​さには、不明確な制限があります。一方、テーブルに対してアンチ JOIN を実行する... Oracle はそれが得意です。テーブルへのデータの一括ロード。Oracle はそれも得意です。一時テーブルを使用します。

1,000 エントリに制限INすることは、サニティ チェックです。あなたがそれを打っているという事実は、あなたが何か非常識なことをしようとしていることを意味します.

于 2012-09-22T00:47:44.490 に答える
0

質問から飛び出して、SQL を組み合わせて、この SQL で 1000 を超える ID を取得できますか。これは、SQL を単純化するためのより良い方法です。

于 2014-09-01T03:43:59.987 に答える
0

それは非常識です。

しかし、おそらくselectから選択しようとすることができます:

SELECT * FROM
  (SELECT * FROM table WHERE ID NOT IN (1,2,3,4,...,1000))
WHERE ID NOT IN (1001,1002,…,2000)

必要な数のレベルを作成します。

于 2014-09-18T10:31:07.500 に答える