Если предположить, что вы пытаетесь генерировать страницы данных и предполагая, что ваше желание, что результаты стабильны и соответствуют ли данные в таблице не меняется (каждая строка из внутреннего запроса возвращается только на одной странице результатов при изменении верхней и нижней границ), наиболее эффективный подход будет по существу тем, что вы опубликовали на начальном этапе. Но вам нужно добавить ORDER BY
во внутренний запрос. В противном случае, было бы совершенно правильным для Oracle вернуть одну строку данных на каждой странице или никогда не возвращать строку на любой странице
SELECT orderid
FROM (SELECT orderid, rownum r
FROM (SELECT orderid
FROM myorders
WHERE ordertype = 'E'
AND orderstatus = 'A'
ORDER BY <<something>>) a
WHERE rownum < 86)
WHERE r > 84
Если вы действительно больше озабочены читаемости, чем производительность, вы можете уменьшить, что, один уровень вложенности, делая что-то вроде
SELECT orderid
FROM (SELECT orderid,
rank() over (order by <<something>>) rnk
FROM myorders
WHERE ordertype = 'E'
AND orderstatus = 'A')
WHERE rnk > 84
AND rnk < 86
в Oracle 12c, Oracle, как ожидается, для поддержки ANSI FETCH
и OFFSET
ключевых слов, чтобы упростить синтаксис немного дальше.
Нет смысла брать строки с 84 по 86, если вы не применяете какие-либо на столе .... чего вы пытаетесь достичь здесь? – haki
Что делать с порядковым номером и orderstatus в вашем втором решении? –
Я даже не вижу, как ваш первый запрос будет скомпилирован, потому что вы выбираете rownum из подзапроса, который его не содержит. –