Отключить ограничение SQL IN Пункт 1000 limit [duplicate]

Пока вы имеете дело с простыми символами ASCII, и вы счастливы использовать встроенные функции, это будет работать:

function reverse(s){
    return s.split("").reverse().join("");
}

Если вам нужно решение, поддерживающее UTF- 16 или других многобайтовых символов, имейте в виду, что эта функция приведет к недопустимым строкам Unicode или действительным строкам, которые выглядят забавно. Возможно, вы захотите рассмотреть этот ответ .

42
задан Jonathan 18 January 2011 в 10:17
поделиться

4 ответа

Вы должны преобразовать предложения IN в предложения INNER JOIN.

Вы можете преобразовать запрос, подобный этому

SELECT  foo   
FROM    bar   
WHERE bar.stuff IN  
       (SELECT  stuff FROM asdf)

в запросе, подобном этому другому.

SELECT  b.foo 
FROM    ( 
        SELECT  DISTINCT stuff 
        FROM    asdf ) a 
JOIN    bar b 
ON      b.stuff = a.stuff

Вы также получите большую производительность

53
ответ дан Jonathan 20 August 2018 в 08:22
поделиться

Другой способ:

SELECT COL1, COL2, COL3 FROM YOUR_TABLE
WHERE 1=1
AND COL2 IN (
SELECT VAL1 as FAKE FROM DUAL
UNION
SELECT VAL2 as FAKE FROM DUAL
UNION
SELECT VAL3 as FAKE FROM DUAL
--...
)
0
ответ дан Andrew 20 August 2018 в 08:22
поделиться
  • 1
    Вы должны использовать UNION ALL вместо конструктора UNION и VALUES вместо обоих. – Hogan 5 October 2016 в 16:39

Для этого есть другое обходное решение, которое не упоминается ни в одном из других ответов (или на других ответах на вопросы):

Любой оператор, такой как x in (1,2,3), может быть переписан как (1,x) in ((1,1), (1,2), (1,3)), а 1000 элементный лимит больше не будет применяться. Я протестировал с индексом на x и объяснил, что план по-прежнему сообщает, что Oracle использует предикат доступа и сканирование диапазона.

72
ответ дан gordy 20 August 2018 в 08:22
поделиться
  • 1
    +1 классный трюк :) - проверено с 10 001 элементом - производительность, кажется, страдает, хотя – Jeffrey Kemp 1 February 2012 в 06:08
  • 2
    Не думал, что, классный трюк – PoX 3 August 2012 в 20:54
  • 3
    Почему это работает? Спасибо за ответ :) – Nitish 15 September 2014 в 11:51
  • 4
    @ Ничто мое предположение заключается в том, что поддержка кортежей появилась позже, и к тому времени разработчики были ознакомлены с принципом ZOI – gordy 7 November 2014 в 20:41
  • 5
    @JeffreyKemp Oracle, по-видимому, ограничивает 70 000 в стиле tuple в статье, но все же лучше обычного ограничения в разделе. – Yazad Khambata 9 January 2017 в 01:01

Мы можем иметь более одного оператора «IN» для одной и той же переменной.

Для ex:

select val
 from table
where val in (1,2,3,...)
or
val in (7,8,9,....)
3
ответ дан J. Chomel 20 August 2018 в 08:22
поделиться
Другие вопросы по тегам:

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