Ограничение по пункту 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
--...
)