28

以下のクエリを試しました。

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

4

10 に答える 10

63

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

肝心なのは、次のような条件が期待どおりに機能するということです。

.. WHERE rownum = 1;

.. WHERE rownum <= 10;

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

.. WHERE rownum = 2;

.. WHERE rownum> 10;

Oraclerownumの理解から引用

動作させるには、次のようにクエリを変更する必要があります。

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

編集:saldescによる注文にrownumを取得するようにクエリを修正しました

于 2012-02-11T12:31:34.893 に答える
11

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

2番目のクエリは、取得した結果を返さないはずです。ORDERBYの後に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                   
于 2012-02-11T13:02:27.690 に答える
2

これを試して:

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

参照

于 2012-02-11T12:30:47.180 に答える
0

この方法を試してみてください 100% うまくいっています SQL> SELECT * FROM STUD;

RNUMBER SNAME MARKS


   104 mahesh                       85
   101 DHANU                        20
   102 BHARATH                      10
   100 RAJ                          50
   103 GOPI                         65

SQL> select * from(select MARKS,ROWNUM AS RS from ( select * from スタッド オーダー by マーク desc)) where RS=2;

 MARKS         RS

    65          2

SQL>

于 2020-10-22T09:51:15.713 に答える
-1

ここで達成しようとしていることを達成するためにRANKorを使用できます。DENSE_RANK

于 2016-05-10T12:19:25.540 に答える