Выбор второй строки таблицы с помощью 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 достичь того, что вы пытаетесь достичь здесь.

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