SQL-запрос с Row_Number, заказ по и где - PullRequest
3 голосов
/ 07 мая 2009

У меня следующий запрос 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.

Ответы [ 5 ]

9 голосов
/ 07 мая 2009

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;
3 голосов
/ 07 мая 2009

Ознакомьтесь с этим FAQ по Oracle . В частности эта часть:

  SELECT * 
  FROM (SELECT a.*, rownum RN 
      FROM (SELECT * 
                         FROM t1 ORDER BY key_column) a
         WHERE rownum <=7)
 WHERE rn >=5
2 голосов
/ 07 мая 2009

Чтобы ответить на ваш первый вопрос: не используйте номер столбца в вашем заказе по пункту, а используйте имя столбца. Я не совсем понимаю ваш второй вопрос, потому что добавление 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 (), если вы хотите, чтобы строки были упорядочены. Сохраняет внутренний вид (большой выигрыш для читабельности).

0 голосов
/ 16 января 2019

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

select * from 
    ( select ,column1,column2,row_number() over (order by columnName) as rnum 
      from table_name) 
where rnum between 5 and 10;
0 голосов
/ 07 мая 2009

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

Select top 100 ID, Column1, Column2
From A_Table
where Column1 like '%value%'
order by Column2 desc
...