1

私のクエリに何か問題がありますか? 以下を使用して、AUDIT_ACTN、次に AUDIT_STAMP で順序付けされた最初の 5 つの結果を取得します。

SELECT * FROM (SELECT * FROM TABLE_SAMPLE ORDER BY AUDIT_ACTN  
ASC,AUDIT_STAMP ASC)
WHERE ROWNUM <= 5

これを使用して、正しい行を取得しているかどうかを確認します。

SELECT * FROM TABLE_SAMPLE  ORDER BY 
AUDIT_ACTN,AUDIT_STAMP

問題は、2 番目のクエリの上位 5 行が 1 番目のクエリの結果とわずかに異なることです。3行だけが同じで、私の観察では、他の2行は2番目のクエリのrownum1と2です。私の質問を理解していただければ幸いです。本当に助けが必要です。ありがとうございます。

4

2 に答える 2

2

サブクエリでは保証されないことを読んだことを覚えてORDER BYいますが、これを使用した代替ソリューションをROW_NUMBER次に示します -- これには、その句が含まORDER BYれます。OVER

SELECT * FROM 
(SELECT Field1, Field2, ROW_NUMBER() OVER (ORDER BY Field2,Field1) AS RN 
 FROM TABLE_SAMPLE 
 ) t 
WHERE RN <= 5

そして、ここにFiddleがあります。

Oracle、サブクエリ、および ORDER BY に関するドキュメントは次のとおりです。

http://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html

サブクエリでは、ORDER BY 句は、結果オフセット句と最初のフェッチ句のいずれかまたは両方を伴うか、ROW_NUMBER 関数と組み合わせて使用​​しない限り、意味がありません。これは、順序が外部の結果セットで保持されるという保証がないためです。外部クエリの ORDER BY とサブクエリの ORDER BY を組み合わせることは許可されています。

幸運を。

于 2013-02-11T02:30:34.540 に答える
1

これを試してください:このクエリは上位 5 レコードを返します。

 SELECT * FROM 
    (SELECT Field1, Field2, rank() OVER (ORDER BY Field1,Field2) AS rank
     FROM TABLE_SAMPLE 
     ) t 
    WHERE t.rank <= 5
于 2013-02-11T05:11:47.510 に答える