0
SELECT orderid 
 FROM (SELECT orderid, rownum r 
         FROM (SELECT orderid 
                 FROM myorders 
                WHERE ordertype = 'E' 
                  AND orderstatus = 'A') a 
         WHERE rownum < 86) 
 WHERE r > 84

ABOVE sqlステートメントをより明確な方法で書き直す最良の方法は何ですか...

以下を試しましたが、結果が得られません。

select orderid 
  from myorders 
 where rownum between 84 and 86
4

4 に答える 4

3

データのページを生成しようとしていると仮定し、テーブル内のデータが変更されていない場合、結果が安定して一貫していることを望んでいると仮定します (内部クエリからのすべての行は、結果の正確に 1 ページに返されます)上限と下限を変更する場合)、最も効率的なアプローチは、基本的に最初に投稿したものです。ORDER BYただし、内部クエリにを追加する必要があります。それ以外の場合、Oracle がすべてのページで 1 行のデータを返すか、どのページでも 1 行も返さないことは完全に正しいことです。

SELECT orderid 
 FROM (SELECT orderid, rownum r 
         FROM (SELECT orderid 
                 FROM myorders 
                WHERE ordertype = 'E' 
                  AND orderstatus = 'A'
                ORDER BY <<something>>) a 
         WHERE rownum < 86) 
 WHERE r > 84

パフォーマンスよりも可読性を重視する場合は、次のような方法でネストを 1 レベル減らすことができます。

SELECT orderid
  FROM (SELECT orderid, 
               rank() over (order by <<something>>) rnk
          FROM myorders
         WHERE ordertype = 'E'
           AND orderstatus = 'A')
 WHERE rnk > 84
   AND rnk < 86

Oracle 12c では、構文をさらに簡素化するために、Oracle は ANSIFETCHとキーワードをサポートする予定です。OFFSET

于 2013-02-21T17:23:51.963 に答える
2

インデントは最初の提案です。ただし、サブクエリの 1 つのセットを削除できます。

 select orderid
 from (SELECT orderid, rownum r
        FROM myorders
        WHERE ordertype = 'E' AND orderstatus = 'A'
       ) a
 where r = 85
于 2013-02-21T17:16:18.440 に答える
0

さらに、行から選択する一般的な例。私の個人的な意見では、ROWNUMではなくROW_NUMBER()を使用する方が賢明です。彼らは完全です。違う...:

-- Between rows --
SELECT * FROM 
     ( SELECT deptno, ename, sal
            , ROW_NUMBER() OVER (ORDER BY ename) row_seq 
  FROM scott.emp)
 WHERE row_seq BETWEEN 5 and 10
 /
于 2013-02-21T20:14:49.910 に答える
0

単一のテーブルを扱っている場合。

SELECT orderid
FROM   myorders 
WHERE  ordertype = 'E' 
AND    orderstatus = 'A'
AND    rownum between 84 and 86
于 2013-02-21T17:37:13.437 に答える