3

rownum は次のように使用できることがわかりました。

1)  select * from emp where rownum<5;
2)  select * from emp where rownum<=5;
3)  select * from emp where rownum=1;

このクエリはすべて、期待される出力を返します。テーブル emp に 7 行あるとします。最初のクエリは 4 行を返し、2 番目は 5 行を返し、3 番目は 1 行を返します。しかし、次のようなものを使用しようとすると:

4)  select * from emp where rownum=5;
5)  select * from emp where rownum>5;
6)  select * from emp where rownum>=5;
7)  select * from emp where rownum between 5 and 10;

このすべての場合で、0 行が返されます。なぜそうなのか?これには具体的な理由はありますか?

4

2 に答える 2

6

これは、rownum が疑似列であり、where 句を適用した後に結果セット内の行をカウントするためです。

オラクルのドキュメントから: -

正の整数より大きい ROWNUM 値をテストする条件は、常に false です。たとえば、次のクエリは行を返しません。

SELECT *
  FROM employees
  WHERE ROWNUM > 1;

フェッチされた最初の行には 1 の ROWNUM が割り当てられ、条件が false になります。フェッチされる 2 番目の行が最初の行になり、1 の ROWNUM が割り当てられ、条件が false になります。その後、すべての行が条件を満たさないため、行は返されません。

次の例のように、ROWNUM を使用してテーブルの各行に一意の値を割り当てることもできます。

UPDATE my_table
  SET column1 = ROWNUM;

これらの参照が役立つ場合があります:-

于 2013-10-27T10:03:34.647 に答える
3

次のようなことができます。

select * from (
  select
    emp.*,
    row_number() over (order by fieldname) as rnum
  from emp
) tmp
where
  rnum between 5 and 10;
于 2013-10-27T09:57:21.300 に答える