2014-10-01 2 views
2

Когда я использую rownum и между ключевыми словами, тогда запрос не возвращает никаких строк. Может ли кто-нибудь объяснить причину, почему запрос не извлекает какие-либо строки?строка num не отображает строки при использовании между ключевым словом

select * from cus where rownum between 2 and 6; 

Я просто хочу, чтобы проверить, будет ли работать ROWNUM, когда она используется с между ключевыми словами .so, я просто попытался выше запрос для отображения строк, которые находятся в пределах от 2 до 6. Но когда я пытался выполнить в запросе он не извлекает никаких строк.

заранее спасибо

+0

mysql or oracle? и если mysql является 'rownum' именем столбца в таблице? –

+0

@AbhikChakraborty это делается в oracle, rownum - ключевое слово в oracle – Smart003

ответ

4

Oracle ROWNUM начинается с 1, так что вы никогда не получите первый ROWNUM, если вы говорите between 2 and N.

Требуется строка, чтобы «инициировать» последовательность псевдоколонны rownum, поэтому, устраняя rownum 1 в ваших критериях, вы удаляете все rownums (или каждая строка имеет, по существу, rownum 0).

Посмотрите на это вот так. Вы не получаете ROWNUM, пока база данных не вернет вам строку. Первая строка любых критериев всегда будет ROWNUM 1.

Теперь трюк, который вы можете использовать, это использовать подзапрос. Каждый подзапрос будет иметь свой собственный rownum, и если вы добавите его в другое имя столбца, вы можете сохранить его во внешних запросах и обработать его, как вам нравится. Поэтому, если вы хотите реализовать подкачку результирующего набора, вы обычно будете псевдонимом rownum из внутренних результатов как rownum_ во внешний подзапрос, чтобы ограничить BETWEEN.

select * from 
    (select t.*, rownum as rownum_ from t) 
where rownum_ between 2 and 6 

Но обратите внимание, что внешний набор результатов будет иметь свой собственный ROWNUM, так что вы можете сделать:

select t2.*, rownum from 
    (select a, b, rownum as rownum_ from t) t2 
where rownum_ between 2 and 6 

Вы увидите rownum на конечный результат по-прежнему начинается с 1, но ваш внутренний результат будет иметь rownum_, начинающийся с 2.

1

выбрать * из cus где rownum от 2 до 6;

Это совершенно неправильно. Потому что ROWNUM - псевдо-столбец, который увеличивается до 2 только тогда, когда он начинался с ROW один (случайный, конечно). В вашем запросе предикат ROWNUM BETWEEN 2 AND 6 не имеет смысла, поскольку ROWNUM еще не назначен.

Давайте понимать этот шаг за шагом:

  1. Понимание того, как интерпретируется SQL заявление. После анализа запроса применяется фильтр.

  2. В запросе, фильтр ROWNUM BETWEEN 2 AND 6 не имеет смысла, так как, Oracle еще не назначен ROWNUM 1, как первая строка еще не извлекается.

  3. Если выбрана первая строка, то ROWNUM присваивается как псевдо-номер.Но фильтр в вашем запросе напрямую указывает на строки между 2 и 6, что абсурдно. Таким образом, строки не возвращаются.

1

Mysql не имеет rownum.

Если вы ищете оракул, может быть, вы можете попробовать что-то вроде этого:

выберите * из (. Выберите CuS *, ROWNUM в ROW_NUM от кли) где row_num между 2 и 6;

или

выберите * из (выберите CuS *, ROWNUM, как row_num из кли.) , где номер_строки> 1 и номер_строки < = 6;