4つの質問があり、すべて ROWNUMの使用法と機能を中心に展開しています 。それぞれの質問に1つずつ答えます。
理由(SOで検索するまではこれが最初の試みでした)Select * From Person Where rownum> 100 and rownum <110; 0行を返しますか?
ROWNUMとここでのページネーションに関するThomasKyteによる素晴らしい説明。
ROWNUM 値は、述語フェーズを通過した後に行に割り当てられます クエリの、ただしクエリが並べ替えまたは集計を行う前。また、ROWNUM値は割り当てられた後にのみインクリメントされるため、次のクエリは行を返しません。
select *
from t
where ROWNUM > 1;
ROWNUM> 1は最初の行には当てはまらないため、ROWNUMは2に進みません。したがって、ROWNUM値が1より大きくなることはありません。
Select ... FROM ... WHERE rownum BETWEEN lowerBoundとupperBoundのような簡単な方法がないのはなぜですか?
はいあります。 Oracle 12cから 以降、新しいトップn行制限を使用できます 特徴。ここで私の答えを参照してください。
たとえば、次のクエリは、4番目に高いの間の従業員を返します。 7番目に高い給与まで 昇順:
SQL> SELECT empno, sal
2 FROM emp
3 ORDER BY sal
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
EMPNO SAL
---------- ----------
7654 1250
7934 1300
7844 1500
7499 1600
SQL>
結果の値のr列を取り除く方法は?
select *
の代わりに 、外部クエリに必要な列名をリストします。クエリを頻繁に使用する場合、ビューの作成は単純な1回限りのアクティビティです。
または、 SQL*Plus
NOPRINTを使用できます 指図。表示したくない列名は表示されません。ただし、SQL*Plusでのみ機能します。
たとえば、
COLUMN column_name NOPRINT
たとえば、
SQL> desc dept
Name Null? Type
----------------------------------------- -------- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;
DEPTNO
----------
10
20
30
40
SQL>
正しいページ付けを保証しますか?
はい、ページネーションクエリを正しく記述すれば可能です。
たとえば、
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM t
ORDER BY val)
WHERE rownum <= 8)
WHERE rnum >= 5;
VAL
----------
3
3
4
4
4 rows selected.
SQL>
または、上記で示したように、12cで新しい行制限機能を使用します。
ここにいくつかの良い例があります。