Ограничение по пункту SQL IN 1000 - PullRequest
45 голосов
/ 18 января 2011

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

Если да, как мы можем поместить более 1000 элементов в предложение SQL IN?

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

Ответы [ 4 ]

81 голосов
/ 31 января 2012

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

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

55 голосов
/ 18 января 2011

Вы должны преобразовать предложения 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

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

5 голосов
/ 27 февраля 2017

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

Например:

select val
 from table
where val in (1,2,3,...)
or
val in (7,8,9,....)
0 голосов
/ 15 марта 2016

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

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
--...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...