SQL-запрос с Row_Number, порядок и где предложение

У меня есть следующий SQL-запрос:

select
     ID, COLUMN1, COLUMN2
from
     (select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
     NO between 0 and 100

Я пытаюсь выбрать первые 100 записей запроса.

select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC

И вот проблемы:

  1. Судя по всему, пункт order by не работает. Я заметил, что мне нужно добавить еще одно предложение order by 2 DESC сразу после (...) from ATABLE, чтобы мой запрос работал. Я что-то делаю не так? Или это ожидаемое поведение?

  2. Как я могу добавить предложение where? Допустим, мне нужно выбрать только первые 100 записей таблицы where COLUMN1 like '%value%'. Я попытался добавить предложение where после (...) from ATABLE, но это привело к ошибке...

Помощь? Спасибо.

PS: я использую Oracle 10g R2.


person Bogdan M    schedule 07.05.2009    source источник
comment
Можете ли вы на самом деле включить другие запросы, которые вы пробовали, вместо того, чтобы просто объяснять их? Это может облегчить обнаружение проблемы.   -  person Tom H    schedule 07.05.2009


Ответы (5)


rownum – это псевдостолбец, в котором подсчитываются строки в результирующем наборе после применения предложения where.

Это то, что вы пытаетесь получить?

SELECT *
FROM ( 
    SELECT id, column1, column2
    FROM atable ORDER BY 2 DESC
) 
WHERE ROWNUM < 100;

Поскольку это псевдостолбец, который является строго счетчиком строк, полученных в результате предложения where, он не позволит вам выполнять разбивку на страницы (т.е. между 200 и 300).

Вероятно, это то, что вы ищете:

SELECT *
FROM
 (SELECT a.*, rownum rnum FROM
     (SELECT id, column1, column2 FROM atable ORDER BY 2 DESC) a WHERE rownum <= 300)
WHERE rnum >= 200;
person Edward Q. Bridges    schedule 07.05.2009
comment
Да, именно то, что мне нужно. Спасибо. - person Bogdan M; 07.05.2009
comment
И я тоже. :-) - person David Brower; 28.09.2016

ознакомьтесь с часто задаваемыми вопросами по Oracle. В частности эта часть:

  SELECT * 
  FROM (SELECT a.*, rownum RN 
      FROM (SELECT * 
                         FROM t1 ORDER BY key_column) a
         WHERE rownum <=7)
 WHERE rn >=5
person willcodejavaforfood    schedule 07.05.2009
comment
Для тех, кому интересно, это называется TOP-N запрос - person northpole; 07.05.2009
comment
Я знаю о top-n, но сейчас он мне совсем не помогает, учитывая, что мне нужно получить ровно n записей между value1 и value2. - person Bogdan M; 07.05.2009
comment
Я думал, что это то, что сделал мой запрос :) - person willcodejavaforfood; 07.05.2009

Чтобы ответить на ваш первый вопрос: не используйте номер столбца в предложении order by, а используйте имя столбца. Я не совсем понимаю ваш второй вопрос, потому что добавление WHERE в ваш самый внутренний SELECT должно помочь:

select ID
,      COLUMN1
,      COLUMN2
from  (select ID
       ,      COLUMN1
       ,      COLUMN2
       ,      row_number() over (order by COLUMN1 DESC) NO
       from   A_TABLE
       where  COLUMNX LIKE '%SOME VALUE%'
      )
where  NO between 0 and 100

P.S. (к willcodejavaforfood) Я думаю, что использование row_number() лучше, когда вы хотите, чтобы строки были упорядочены. Это сохраняет внутренний вид (большой выигрыш в удобочитаемости).

person Community    schedule 07.05.2009
comment
+1 за использование ROW_NUMBER(), которое легче понять. -1 за ваш P.S. предложение ORDER BY во внутреннем представлении не сработает - предложение willcodejavaforfood работает отлично. - person Jeffrey Kemp; 08.06.2009
comment
Отредактировал мой P.S. (удалена часть об использовании порядка в подзапросе), потому что у меня нет доказательства, и его будет сложно построить (если возможно...) - person ; 09.06.2009

Почему бы тебе не использовать

Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc
person Blerta    schedule 07.05.2009
comment
Что делать, если мне нужно выбрать строки между row_num 200 и 300? Вот почему я пытался использовать row_num в первую очередь... - person Bogdan M; 07.05.2009
comment
Извините, я не видел, что вы используете Oracle. - person Blerta; 07.05.2009

Здесь вы получите ограниченную запись из базы данных оракула без использования rownum

select * from 
    ( select ,column1,column2,row_number() over (order by columnName) as rnum 
      from table_name) 
where rnum between 5 and 10;
person know computer    schedule 16.01.2019