3

このSQLクエリを使用して、8〜10のレコードのみを取得したいと思います。

select *
from(
SELECT a.*,rownum rn 
FROM ACTIVESESSIONSLOG  a
ORDER BY USERID ASC)
WHERE rn  >= 8 and rn <= 10

このSQLクエリをページ付けに実装すると、ページに表示するように構成した行数に関係なく、2番目のページに1行が表示されるたびに取得されます。このSQLクエリは有効ですか?

これはテーブル構造です:

-- TABLE ACTIVESESSIONSLOG

CREATE TABLE ACTIVESESSIONSLOG(
  ASESSIONID VARCHAR2(30 ) NOT NULL,
  USERID VARCHAR2(30 ),
  ACTIVITYSTART TIMESTAMP(6),
  ACTIVITYEND TIMESTAMP(6),
  ACTIVITY CLOB
)
/

幸運をお祈りしています

4

2 に答える 2

4

rownumが前に適用されるORDER BYため、クエリはほぼ確実に期待どおりに動作しません。クエリは基本的に任意の3行を要求しており、ORDER BY何も役に立ちません。

row_number代わりに分析関数を使用できます。

SELECT *
  FROM (SELECT a.*,
               row_number() over (order by userid asc) rn
          FROM activeSessionsLog a)
 WHERE rn BETWEEN 8 AND 10

結果をページングします

SQL> ed
Wrote file afiedt.buf

  1  select empno, ename, job
  2    from (select e.*,
  3                 row_number() over (order by empno) rn
  4            from emp e)
  5*  where rn between 1 and 3
SQL> /

     EMPNO ENAME      JOB
---------- ---------- ---------
      7369 SMITH      CLERK
      7499 ALLEN      SALESMAN
      7521 WARD       SALESMAN

SQL> ed
Wrote file afiedt.buf

  1  select empno, ename, job
  2    from (select e.*,
  3                 row_number() over (order by empno) rn
  4            from emp e)
  5*  where rn between 4 and 8
SQL> /

     EMPNO ENAME      JOB
---------- ---------- ---------
      7566 JONES      MANAGER
      7654 MARTIN     SALESMAN
      7698 BLAKE      MANAGER
      7782 CLARK      MANAGER
      7788 SCOTT      ANALYST

SQL> ed
Wrote file afiedt.buf

  1  select empno, ename, job
  2    from (select e.*,
  3                 row_number() over (order by empno) rn
  4            from emp e)
  5*  where rn between 9 and 11
SQL> /

     EMPNO ENAME      JOB
---------- ---------- ---------
      7839 KING       PRESIDENT
      7844 TURNER     SALESMAN
      7876 ADAMS      CLERK

rownum <= 10ただし、Oracleが内部述語を使用して、最初の10行を識別した後、データの並べ替えを停止できることを知ることができるこのようなことを行う方が効率的かもしれません。

SELECT c.*
  FROM (SELECT b.*, rownum rn
          FROM (SELECT a.*
                  FROM activeSessionsLog a
                 ORDER BY userid asc) b
         WHERE rownum <= 10) c
 WHERE rn >= 8
于 2012-04-10T15:35:27.030 に答える
1

Oracle 12c以降、offset/fetch句を使用できるようになりました。

これで、次のようなクエリを記述できます。

SELECT *
FROM user_objects
ORDER object_name
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

この新機能を確認し、実行計画の改善についても検討してください。

于 2017-05-18T09:27:50.263 に答える