Выбор второй строки таблицы с помощью rownum
я попробовал следующий запрос:
select empno from (
select empno
from emp
order by sal desc
)
where rownum = 2
Это не возвращает никаких записей.
когда я попробовал этот запрос
select rownum,empno from (
select empno from emp order by sal desc)
Это дает мне этот выход:
ROWNUM EMPNO
1 7802
2 7809
3 7813
4 7823
может ли кто-нибудь сказать мне, в чем проблема с моим первым запросом? Почему он не возвращает никаких записей, Когда я добавляю фильтр ROWNUM?
7 ответов
чтобы объяснить это поведение, нам нужно понять, как Oracle обрабатывает Параметр rownum. При назначении ROWNUM строке Oracle начинается с 1 и только только увеличивает значение, когда выбрана строка, то есть, когда все условия в предложении WHERE выполняются. Так как наше состояние требует этот ROWNUM больше 2, строки не выбраны, а ROWNUM никогда не увеличивается больше 1.
суть в том, что такие условия, как следующее, будут работать как ожидаемый.
.. Где rownum = 1;
.. Где rownum
в то время как запросы с этими условиями всегда возвращает ноль строк.
.. Где rownum = 2;
.. Где rownum > 10;
цитата из понимание Oracle rownum
вы должны изменить запрос таким образом, чтобы работать:
select empno
from
(
select empno, rownum as rn
from (
select empno
from emp
order by sal desc
)
)
where rn=2;
редактировать: я исправила запрос, чтобы получить rownum после заказ sal desc
на первый запрос, первая строка будет иметь ROWNUM = 1, поэтому будет отклонена. Второй ряд также будет иметь параметр rownum = 1 (потому что, прежде чем был отклонен), а также быть отклонена, в третьем ряду также будет иметь параметр rownum = 1 (потому что все строки, прежде чем были отклонены), а также быть отвергнуты и т. д... В результате все строки отклоняются.
на второй запрос не должна возвращать результат, который вы получили. Он должен правильно назначить ROWNUM после ЗАКАЗАТЬ.
как следствие всего этого, вам нужно использовать не 2, а 3 уровня подзапросов, например:
SELECT EMPNO, SAL FROM ( -- Make sure row is not rejected before next ROWNUM can be assigned.
SELECT EMPNO, SAL, ROWNUM R FROM ( -- Make sure ROWNUM is assigned after ORDER BY.
SELECT EMPNO, SAL
FROM EMP
ORDER BY SAL DESC
)
)
WHERE R = 2
результат:
EMPNO SAL
---------------------- ----------------------
3 7813
попробуйте это:
SELECT ROW_NUMBER() OVER (ORDER BY empno) AS RowNum,
empno
FROM tableName
WHERE RowNumber = 2;
Фрагмент Из Источника:
SELECT last_name FROM
(SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
WHERE R BETWEEN 51 and 100
для n-й строки с использованием rownum в oracle:
select * from TEST WHERE ROWNUM<=n
MINUS
select * from TEST WHERE ROWNUM<=(n-1);
пример для второй строки :
select * from TEST WHERE ROWNUM<=2
MINUS
select * from TEST WHERE ROWNUM<=1;
Select * From (SELECT *,
ROW_NUMBER() OVER(ORDER BY column_name DESC) AS mRow
FROM table_name
WHERE condition) as TT
Where TT.mRow=2;