web-dev-qa-db-ja.com

rownumを使用してテーブルの2番目の行を選択する

私は以下のクエリを試しました:

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フィルターを追加したときにレコードが返されないのはなぜですか?

19
Gaurav Soni

この動作を説明するには、OracleがROWNUMを処理する方法を理解する必要があります。 ROWNUMを行に割り当てると、Oracleは1から始まり、行が選択されたときにのみ値を増分します。つまり、WHERE句のすべての条件が満たされたときです。この条件ではROWNUMが2より大きい必要があるため、行は選択されず、ROWNUMが1を超えて増分されることはありません。

一番下の行は、次のような条件が期待どおりに機能することです。

.. WHERE rownum = 1;

.. WHERE rownum <= 10;

これらの条件を持つクエリは常にゼロ行を返します。

.. WHERE rownum = 2;

.. WHERE rownum> 10;

Oracle rownumの理解 から引用

動作させるには、この方法でクエリを変更する必要があります。

select empno
from
    (
    select empno, rownum as rn 
    from (
          select empno
          from emp
          order by sal desc
          )
    )
where rn=2;

[〜#〜] edit [〜#〜]:クエリを修正して、行番号を取得しましたsal descによる順序

50
Florin Ghita

最初のクエリでは、最初の行はROWNUM = 1になり、拒否されます。 2番目の行にもROWNUM = 1(前の行が拒否されたため)と拒否され、3番目の行にもROWNUM = 1(拒否される前のすべての行)と拒否されます...などその結果、すべての行が拒否されます。

2番目のクエリは、取得した結果を返しません。 ROWBYafterORDER 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                   
8

Oracleでrownumを使用するn番目の行の場合:

select * from TEST WHERE ROWNUM<=n
MINUS
select * from TEST WHERE ROWNUM<=(n-1);

2行目の例:

select * from TEST WHERE ROWNUM<=2
MINUS
select * from TEST WHERE ROWNUM<=1;
1
Md. Kamruzzaman

これを試して:

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

[〜#〜] reference [〜#〜]

1
John Woo

からempnoを選択します(
empno、rownumをラムとして選択
empから、
sal descによる注文

where rum = 2;

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

FROM table_name 

WHERE condition) as TT
Where TT.mRow=2;
0
Sachin Patil