SQL Oracle: Как использовать больше чем 1 000 объектов в В пункте [дубликат]

Этот вопрос уже имеет ответ здесь:

У меня есть 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 работало отлично. Спасибо все, кто способствовал с ценными предложениями.

11
задан Mehper C. Palavuzlar 8 March 2010 в 15:15
поделиться

5 ответов

Не уверен, что использование такого количества значений в IN() так уж хорошо, на самом деле - особенно для представлений.

Когда вы говорите "результаты странные", может это из-за проблемы со скобками? Что если вы попробуете вот это, вместо того, что вы предложили :

SELECT ...
FROM ...
WHERE ...
      AND (
          ep_codes IN (...1000 ep_codes...)
          OR  ep_codes IN (...200 ep_codes...)
      )

Сделает ли это результаты менее странными?

18
ответ дан 3 December 2019 в 00:54
поделиться

На самом деле здесь можно использовать коллекции / мультимножества. Для их хранения вам понадобится тип числовой таблицы.

CREATE TYPE NUMBER_TABLE AS TABLE OF NUMBER;
...
SELECT *
FROM my_view
WHERE period MEMBER OF NUMBER_TABLE(1,2,3...10000)

Подробнее о мультимножествах здесь :

7
ответ дан 3 December 2019 в 00:54
поделиться

Рекомендуемый способ справиться с этим в 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)
27
ответ дан 3 December 2019 в 00:54
поделиться

Похоже, что было бы лучше, как для производительности, так и для удобства обслуживания, поместить коды в отдельную таблицу.

SELECT ...
FROM ...
WHERE ...
   AND ep_code in (select code from ep_code_table)
1
ответ дан 3 December 2019 в 00:54
поделиться

не могли бы вы вставить значения 1200 ep_code во временную таблицу, а затем INNER JOIN в эту таблицу, чтобы вместо этого отфильтровать строки?

SELECT a.*
FROM mytable a
INNER JOIN tmp ON (tmp.ep_code = a.ep_code)
WHERE ...
0
ответ дан 3 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: