私は以下のクエリを試しました:
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フィルターを追加したときにレコードが返されないのはなぜですか?
この動作を説明するには、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による順序
最初のクエリでは、最初の行は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
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;
これを試して:
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
からempnoを選択します(
empno、rownumをラムとして選択
empから、
sal descによる注文
)
where rum = 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;