Предел элемента в позиции 1000 IN

Можно добавить более 1000 элементов в предложение SQL IN? У нас возникли проблемы с тем, что наша база данных Oracle не справляется с этим.

ЕСЛИ да, как мы помещаем более 1000 элементов в предложение SQL IN?

ЕСЛИ нет, что еще я могу сделать?

Ответ 1

Вы должны преобразовать предложения IN в предложения INNER JOIN.

Вы можете преобразовать запрос, подобный этому

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

Вы также получите большую производительность

Ответ 2

Там есть еще одно обходное решение, которое не упоминается ни в одном из других ответов (или других ответов на вопросы):

Любой оператор, такой как x in (1,2,3), может быть переписан как (1,x) in ((1,1), (1,2), (1,3)), а ограничение 1000 элементов больше не будет применяться. Я тестировал с индексом x и объяснял, что план все еще сообщает, что Oracle использует предикат доступа и сканирование диапазона.

Ответ 3

Мы можем иметь более одного оператора "IN" для той же переменной.

Для ex:

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

Ответ 4

Другой способ:

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
--...
)