Выбор второй строки таблицы с помощью 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?
10 ответов
Чтобы объяснить это поведение, нам нужно понять, как Oracle обрабатывает ROWNUM. Когда ROWNUM присваивается строке, Oracle начинается с 1 и увеличивает значение только при выборе строки; то есть, когда все условия в предложении WHERE выполнены. Поскольку наше условие требует, чтобы ROWNUM было больше 2, строки не выбираются и ROWNUM никогда не увеличивается больше 1.
Суть в том, что следующие условия будут работать так, как ожидается.
.. ГДЕ rownum = 1;
.. ГДЕ rownum <= 10;
В то время как запросы с этими условиями всегда будут возвращать ноль строк.
.. ГДЕ 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 (потому что все строки, прежде чем она была отклонена), а также будет отклонена и т. Д.NET В результате все строки отклоняются.
Второй запрос не должен возвращать полученный вами результат. Он должен правильно назначить ROWNUM после ORDER BY.
Как следствие всего этого, вам нужно использовать не 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;
Выбрать вторую строку из таблицы в Oracle
SELECT *
FROM (SELECT * FROM emp ORDER BY rownum DESC)
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;
Попробуйте так, чтобы он работал 100% SQL> SELECT * FROM STUD;
ЗНАКИ RNUMBER
104 mahesh 85
101 DHANU 20
102 BHARATH 10
100 RAJ 50
103 GOPI 65
SQL> выберите * из (выберите МАРКИ,ROWNUM AS RS из (выберите * из порядка шпилек по меткам по убыванию)), где RS =2;
MARKS RS
65 2
SQL>
Выберите empno из (
выберите empno,rownum как ром
от emp,
заказ по sal desc
)
где ром =2;
Попробуйте этот запрос на 100% работает
Выберите * из (выберите rownum как rn,emp.* from emp) Где rn=2;
Ты можешь использовать RANK
или же DENSE_RANK
достичь того, что вы пытаетесь достичь здесь.