Оператор SQL «IN» содержит слишком много выражений - PullRequest
2 голосов
/ 08 ноября 2010

Я использую JDBC для извлечения базы данных Oracle с помощью оператора «IN». Но есть слишком много выражений, около> 1000. Похоже:

SELECT * FROM MyTable WHERE name IN (?, ?, ?......); --More than 1000 question signal

Вызывает 100 синтаксическую ошибку или нарушение правила доступа ’, что означает‘ максимальное количество выражений в списке 1000 ’.

Должен ли я выполнять операцию извлечения много раз (например, используя 100 ‘?’ И извлекать 10 раз) и объединять списки? Есть лучшее решение? Спасибо!

Edit: У меня нет шансов изменить базу данных, которая не является моим произведением искусства.

Ответы [ 4 ]

6 голосов
/ 08 ноября 2010

Я бы переосмыслил логику того, почему вам нужно было бы передать столько всего, что нужно искать. Возможно, есть другой способ указать, что вы ищете.

В качестве альтернативы, другой вариант - создать временную таблицу, загрузить искомые ключи в таблицу и затем выполнить соединение между таблицей данных и таблицей ключей. Тогда вам не понадобится предложение in ().

1 голос
/ 08 ноября 2010

путь грубой силы - это

(foo in (1,4,8,12,1000))  or (foo in (2333,2443,2453,4665))

, где каждый в пункте меньше 1000

Конечно, шансы выполнения запроса не очень хорошие.

1 голос
/ 08 ноября 2010

Если у вас так много выражений, может быть проще вставить их во временную таблицу, а затем запросить MyTable против временной.

0 голосов
/ 08 ноября 2010

У Oracle проблемы со списком IN> ~ 1000.

  1. JOIN: создайте (необязательно временную) таблицу с элементами списка и присоедините таблицу к вашему запросу.Если вы используете более долговременную таблицу, то укажите идентификатор сеанса в качестве ключа.Похоже, что это может не сработать, так как у вас нет доступа к схеме?
  2. UNION (ALL): разбить ваш список на менее 1000 и объединить множественные выборки,
  3. ИЛИ: (уже упоминалось) или ваш список

Лично я предпочитаю объединение для такого типа вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...