Проблема с "IN" при выполнении запроса - PullRequest
0 голосов
/ 10 марта 2009

Я пытаюсь найти сотрудников по их коду и отделу.

Я запустил запрос, используя оператор IN, который имеет 1200 кодов сотрудников. Когда я выполнил запрос, я получил исключение («Максимально 1000 записей разрешено в IN»).

Может кто-нибудь помочь мне с этим вопросом.

Ответы [ 4 ]

5 голосов
/ 10 марта 2009

Загрузка этих записей во временную таблицу и использование объединения почти наверняка будет намного быстрее. Как таковой, парсер должен построить огромное дерево условий для IN.

Примечание: я не знаю, поддерживает ли MYSQL временные таблицы уровня транзакций Oracle или SQLServer, но даже «настоящая» таблица должна быть быстрее, особенно если она создается один раз и используется повторно. Конечно, существует много переменных, таких как возможность пакетной вставки в эту таблицу, стоимость записи журналов транзакций и т. Д.

Перечитываю ваш вопрос: где вы получаете эти коды сотрудников? Вы можете получить их за столом или присоединиться?

1 голос
/ 10 марта 2009

Многие СУБД не допускают такой запрос, как

SELECT * FROM table WHERE col IN (...)

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

SELECT * FROM table WHERE col IN (...) OR col IN (...)

или

SELECT * FROM table WHERE col IN (...)
UNION
SELECT * FROM table WHERE col IN (...)

(хотя это не имеет смысла и вряд ли сработает).

В противном случае вы должны хранить ваши значения во временной таблице и использовать вместо них JOIN. Откуда вы берете свои 1200 кодов - они случайно не находятся в одной базе данных? :)

0 голосов
/ 10 марта 2009

Создать временную таблицу в памяти (только для небольших таблиц), заполнить результатами хранимых процедур. Выполните выборку с помощью объединения на временной таблице. Оставьте временную таблицу.

CREATE TEMPORARY TABLE ENGINE=MEMORY tmp AS 
  SELECT code FROM employee; // in-memory temporary table (small tables)

SELECT col1, col2 FROM table 
    INNER JOIN tmp ON table.code = tmp.code; // join faster than subquery

DROP TEMPORARY TABLE tmp; // cleanup temporary table
0 голосов
/ 10 марта 2009

Создайте (временную) таблицу, которая будет содержать ваши коды сотрудников, заполните ее и сделайте запрос следующим образом:

SELECT *
FROM mytable
WHERE empcode IN (SELECT mycode FROM temptable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...