2011-01-18 62 views
41

SQL IN句に1000を超える項目を入れることはできますか?私たちは、Oracleデータベースで問題を処理していませんでした。SQL IN句1000項目の制限

はい、1000個以上の項目をSQL IN句に挿入するにはどうすればよいですか?

私は他に何ができますか?

+5

の可能重複[のOracle SQL::IN句内の1000個の以上のアイテムを使用する方法](http://stackoverflow.com/questions/2401066/oracle-sql-how EX用

1000-items-than-in-clause) –

+2

重複していることを除けば、理由のためにin節の制限があることをお知らせしたいと思います。非常にリソース集中的なクエリです。あなたは@Jonathanが言及したことを行うべきです。 –

+1

[Oracle IN句に1000を超える値を入れる方法](http://stackoverflow.com/questions/400255/how-to-put-more-than-1000-values-into-an-oracle -in-clause) –

答えて

52

IN句をINNER JOIN句に変換する必要があります。

あなたは、この他の1のようなクエリでは、この1

SELECT foo 
FROM bar 
WHERE bar.stuff IN 
     (SELECT stuff FROM asdf) 

のようなクエリを変換することができます。

SELECT b.foo 
FROM ( 
     SELECT DISTINCT stuff 
     FROM asdf) a 
JOIN bar b 
ON  b.stuff = a.stuff 

また、性能の多くを得ることができます

+1

洞察のために+1 – Jeune

70

他の回答(または他の回答の質問)のいずれかに記載されていない。このため、別の回避策があります:文の

任意のようなx in (1,2,3)(1,x) in ((1,1), (1,2), (1,3))と書き換えられ、1000要素の制限は適用されなくなります。私はxの索引でテストし、Oracleがアクセス述部とレンジ・スキャンを使用していることを示す計画をまだ説明していません。

+0

+1クールトリック:) - 10,001要素でテスト - パフォーマンスは苦しんでいるようだ –

+0

それは、クールなトリックと思わなかった – PoX

+0

私の好きな答え! – TrojanName

0

別の方法:

SELECT COL1, COL2, COL3 FROM YOUR_TABLE 
WHERE 1=1 
AND COL2 IN (
SELECT VAL1 as FAKE FROM DUAL 
UNION 
SELECT VAL2 as FAKE FROM DUAL 
UNION 
SELECT VAL3 as FAKE FROM DUAL 
--... 
) 
+0

両方の代わりに 'UNION'と' VALUES'コンストラクタの代わりに 'UNION ALL'を使うべきです。 – Hogan

2

私たちは、同じ変数に複数の "IN" 文を持つことができます。

select val 
from table 
where val in (1,2,3,...) 
or 
val in (7,8,9,....)