Выберите 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 - это имена столбцов вашей таблицы.