Измените IN с помощью JOIN, чтобы обойти ограничение в 1000 - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть оракульный запрос на удаление строк в дочерней таблице, но запрос не работает из-за слишком большого количества значений в предложении in.Есть ли другой способ, которым я могу написать это, используя join или что-то еще, чтобы это работало?

delete from PROCESS 
where PACKAGE_ID in (select id from PACKAGE where NAME like 'Test%');

Использовал * вместо id во внутреннем выборетам, поэтому, когда я переключился на id, это сработало.Но мне все еще любопытно, может ли это быть написано по-другому, поскольку в предложении in есть ограничение в 1000 (?) Элементов.

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012
delete from 
  PROCESS 
where 
  exists(select 1 from PACKAGE where NAME like 'Test%' and id = PROCESS.id);

Индекс свыше (PACKAGE.id, PACKAGE.NAME) был бы очень полезен для ускорения подзапроса.

2 голосов
/ 03 февраля 2012

Ограничение в 1000 элементов в предложении IN применяется только тогда, когда вы указываете их «вручную». Он не применяется, когда элементы возвращаются подзапросом.

Я думаю, что путь, которым ты обладаешь сейчас, - это путь.

0 голосов
/ 03 февраля 2012

Использовал * вместо идентификатора во внутреннем выделении, поэтому, когда я переключился на идентификатор, это сработало.

Это не сработает, потому что он выбирает все столбцы, тогда как вам нужен только один. Если вы развернете *, вы получите что-то вроде следующего, что не имеет смысла:

where PACKAGE_ID in (select id, something, foo, name from PACKAGE);

Но мне все еще любопытно, можно ли это написать по-другому, поскольку в предложении in содержится ограничение в 1000 (?) Элементов.

Нет такого ограничения для дополнительного выбора. На самом деле, это должен быть лучший способ написать этот запрос.

Существует ограничение (возможно 1000) для списка IN :

where id in (1,2,3,4,5)
0 голосов
/ 03 февраля 2012

Вы можете попробовать добавить GROUP BY

delete from PROCESS 
where PACKAGE_ID in (select id from PACKAGE where NAME like 'Test%' GROUP BY id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...