Ограничение по пункту SQL IN 1000

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

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

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

5 ответов

Решение

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

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

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

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

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

Например:

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

Если у вас нет возможности создать временную таблицу, вы можете смоделировать ее с помощью предложения WITH.

      with t as (
  select 1 val from dual 
  union all select 2 from dual
  union all select 3 from dual
    ...
  union all select 5001 from dual
  union all select 5002 from dual
)
select * 
  from mytable
 where col1 in (select val from t)

Очевидно, вы также можете присоединиться к mytable к t

Мне больше всего нравится ответ Горди, просто показывающий другой путь.

По-другому:

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
--...
)
Другие вопросы по тегам