Выбор второй строки таблицы с помощью 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;

выберите empno от(
выберите empno, rownum как ром
от ЭМП
заказ от sal desc
)
где ром=2;


Select * From (SELECT *,
  ROW_NUMBER() OVER(ORDER BY column_name  DESC) AS mRow

FROM table_name 

WHERE condition) as TT
Where TT.mRow=2;

можно использовать RANK или DENSE_RANK чтобы достичь того, чего вы пытаетесь достичь здесь.