Использование rownum с комбинацией ключевых слов - PullRequest
0 голосов
/ 06 сентября 2011

Я видел этот запрос Oracle SQL для использования rownum с комбинацией ключевого слова before.

select *
from
( select rownum rnum, a.*
from (your_query) a
where rownum <= :M )
where rnum >= :N;

, чтобы получить строки от n до m из «вашего запроса».

Я хочу попробовать, может кто-нибудь сказать мне, как я могу получить данные из таблицы Emp для выборки записей от 4 до 8 записей

select *
from
( select rownum rnum, a.*
from (select * from emp) a
where rownum <= 4 )
where rnum >= 8;

Но это не работаетМожет кто-нибудь, пожалуйста, скажите мне, почему.

Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 06 сентября 2011

Это потому, что вы ограничиваете свой запрос <= 4 строками, поэтому, когда вы фильтруете, чтобы показать записи> = 8, есть только 4 записи для просмотра ....

Инвертируйте числадолжен увидеть результат:

select *
from
( select rownum rnum, a.*
from (select * from emp) a
where rownum <= 8 )
where rnum >= 4;
2 голосов
/ 06 сентября 2011

Если бы мне пришлось угадывать, я бы сказал, что причина, по которой вы не видите того, что ожидаете (в дополнение к обратным операторам, как указывает @diagonalbatman), заключается в том, что вы не сообщили базе данных, что порядок, в котором вы хотели получить строки. По сути, вы говорите базе данных вернуть любые 5 строк. Вы даже не можете быть уверены, что этот запрос всегда будет возвращать одни и те же пять строк. Каждый раз, когда вы получаете подмножество, подобное этому, вы должны использовать условие order by в самом внутреннем запросе, чтобы сортировка применялась до выдачи значений rownum:

SELECT *
FROM   (SELECT ROWNUM rnum, a.*
        FROM   (SELECT   *
                FROM     emp
                ORDER BY emp_id) a
        WHERE  ROWNUM <= 8)
WHERE  rnum >= 4;
1 голос
/ 06 сентября 2011

Когда вы запрашиваете все данные во внутреннем операторе (если у вас огромные объемы данных, нет хорошей идеи!), Вы также можете использовать ключевое слово BETWEEN.

SELECT *
  FROM 
       (SELECT rownum AS rnum,
               a.* 
          FROM EMP) a
 WHERE rnum BETWEEN 4 AND 8;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...