Выберите n записей из базы данных оракула

Я должен выбрать количество строк из базы данных оракула из SAP, используя родной SQL. В открытом SQL запрос будет выглядеть так

    select * from myDB where size > 2000 upto n rows.

что я узнал из других постов эквивалентный нативный SQL-запрос будет

    SELECT * FROM myDB WHERE SIZE > 2000 AND rownum <= 100

это правильно?

Нужно ли иметь rownum в качестве одного из полей в таблице БД?

3 ответа

SELECT *
FROM   myDB
WHERE  SIZE   > 2000
AND    ROWNUM <= 100

Это синтаксически правильный запрос.

Нужно ли иметь rownum в качестве одного из полей в таблице БД?

Нет, ROWNUM псевдостолбец назначает для каждой строки, возвращаемой запросом, число, указывающее порядок, в котором Oracle выбирает строку из таблицы или набора соединенных строк. Первый выбранный ряд имеет ROWNUM из 1, второй имеет 2, и так далее.

Обратите внимание, что ROWNUM применяется перед любым ORDER BY статьи.

Так:

SELECT *
FROM   myDB
WHERE  ROWNUM <= 10
ORDER BY column_name

Выберет 10 строк (это могут быть любые 10 строк и не обязательно 10 строк, которые сначала находятся в желаемом порядке), а затем упорядочит эти 10 строк по нужному столбцу.

Если вы хотите получить строки со значениями top-N для столбца, вам нужно применить ORDER BY сначала, а затем ограничить количество строк:

SELECT *
FROM   ( SELECT *
         FROM   myDB 
         ORDER BY column_name )
WHERE  ROWNUM <= 10

Если вы используете Oracle 12, то они реализовали новый синтаксис для запросов TOP-N:

SELECT *
FROM   myDB
ORDER BY column_name
FETCH FIRST 10 ROWS ONLY;

ROWNUM псевдостолбец, генерируемый Oracle, когда вы выполняете SELECT, Присвоение значения ROWNUM это последнее, что делается перед тем, как запрос возвращает строку - таким образом, первая строка, выданная запросом, имеет значение ROWNUM = 1, вторая строка, выданная запросом, имеет значение ROWNUM = 2 и т. д. Обратите внимание: это означает, что утверждение, подобное следующему, НЕ ВОЗВРАЩАЕТСЯ:

SELECT *
  FROM SOME_TABLE
  WHERE ROWNUM >= 2

Почему это не возвращает строк? Это потому, что первая строка, которая будет отправлена ​​запросом, всегда имеет значение ROWNUM = 1, а так как запрос ищет только строки с ROWNUM >= 2, строки не будут выбраны, поскольку первое значение ROWNUM, равное 1, применяется к первому строка выбрасывается.

ОДНАКО - если вы действительно хотите получить все строки, КРОМЕ первого (или первых 10, или что у вас есть), вы можете сделать это так:

SELECT *
  FROM (SELECT *, ROWNUM AS INNER_ROWNUM
          FROM SOME_TABLE
          WHERE SOMETHING = SOMETHING_ELSE
          ORDER BY WHATEVER) i
  WHERE i.INNER_ROWNUM IN (1, 2, 3, 5, 7, 11, 13, 17, 19);

Здесь мы используем внутренний SELECT, который получает ВСЕ строки для заданного условия (SOMETHING = SOMETHING_ELSE) и назначает ROWNUM из запроса INNER вычисляемому столбцу с именем INNER_ROWNUM, который мы затем можем использовать в качестве обычного столбца во внешнем запросе.

Используйте концепцию rownum, это псевдостолбец в Oracle, используя эту концепцию, мы можем достичь TOP функциональность ключевых слов.

select col1,col2,col3..coln from
(
select rownum rn,e.* from mydb where size>2000
)
where rn>N

Примечание: от Col1 до coln - это имена столбцов вашей таблицы.

Другие вопросы по тегам