2015-08-19 7 views
0

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

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

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

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

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

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

+0

Почему бы не использовать ** Выбрать Top **? – code

+2

@code - Потому что Oracle не поддерживает 'TOP' –

+0

Да, но у вас уже есть эквивалент oracle ** rownum ** почему это не работает – code

ответ

1

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

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); 

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

+0

Хороший ответ, но в этом внутреннем запросе отсутствует ORDER BY', иначе нет смысла получите строку «5», но не строку «4». –

+0

@JeffreyKemp - добавлен ORDER BY. Благодарю. –

+0

«ROWNUM - это псевдоколонка, созданная Oracle всякий раз, когда вы выполняете SELECT» ... или обновление или удаление, конечно же. И на самом деле rownum применяется до того, как произойдет какой-либо шаг агрегации, следовательно: «выберите count (*) from ... where rownum <2" может только возвращать 0 или 1 и является божьим критерием существования строки. –

0

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

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

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

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

Является синтаксически правильным запросом.

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

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

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

Итак:

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

отберет 10 строк (это может быть любые 10 строк и не обязательно 10 строк, которые первые в желаемом заказе), а затем закажут эти 10 строк по нужной колонке.

Если вы хотите, чтобы получить строки с топ-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;