Этот вопрос уже имеет ответ здесь:
У меня есть SQL-оператор, где я хотел бы получить данные 1200 ep_codes
путем использования IN
пункт. Когда я включаю больше чем 1 000 ep_codes
внутри В пункте, Oracle заявляет, что мне не разрешают сделать это. Для преодоления этого я пытался изменить код SQL следующим образом:
SELECT period, ...
FROM my_view
WHERE period = '200912'
...
AND ep_codes IN (...1000 ep_codes...)
OR ep_codes IN (...200 ep_codes...)
Код был выполнен успешно, но результаты являются странными (результаты вычисления выбираются в течение всех периодов, не только для 200 912, который не является тем, что я хочу). Действительно ли уместно сделать то использование OR
между IN
пункты или я должны выполнить два отдельных кода как один с 1 000 и другой с 200 ep_codes?
Решение Pascal Martin работало отлично. Спасибо все, кто способствовал с ценными предложениями.
Не уверен, что использование такого количества значений в IN()
так уж хорошо, на самом деле - особенно для представлений.
Когда вы говорите "результаты странные", может это из-за проблемы со скобками? Что если вы попробуете вот это, вместо того, что вы предложили :
SELECT ...
FROM ...
WHERE ...
AND (
ep_codes IN (...1000 ep_codes...)
OR ep_codes IN (...200 ep_codes...)
)
Сделает ли это результаты менее странными?
На самом деле здесь можно использовать коллекции / мультимножества. Для их хранения вам понадобится тип числовой таблицы.
CREATE TYPE NUMBER_TABLE AS TABLE OF NUMBER;
...
SELECT *
FROM my_view
WHERE period MEMBER OF NUMBER_TABLE(1,2,3...10000)
Подробнее о мультимножествах здесь :
Рекомендуемый способ справиться с этим в Oracle - создать временную таблицу, записать в нее значения и затем присоединиться к ней. Использование динамически создаваемых предложений IN
означает, что оптимизатор запросов выполняет «жесткий синтаксический анализ» каждого запроса.
create global temporary table LOOKUP
(
ID NUMBER
) on commit delete rows;
-- Do a batch insert from your application to populate this table
insert into lookup(id) values (?)
-- join to it
select foo from bar where code in (select id from lookup)
Похоже, что было бы лучше, как для производительности, так и для удобства обслуживания, поместить коды в отдельную таблицу.
SELECT ...
FROM ...
WHERE ...
AND ep_code in (select code from ep_code_table)
не могли бы вы вставить значения 1200 ep_code
во временную таблицу, а затем INNER JOIN
в эту таблицу, чтобы вместо этого отфильтровать строки?
SELECT a.*
FROM mytable a
INNER JOIN tmp ON (tmp.ep_code = a.ep_code)
WHERE ...