2

今日の日付から、テーブルから 7 つのイベントを返して、日付順に並べようとしています。

SELECT ID
FROM table
 where ID in (select ID from table
where DATEFIELD >= trunc(sysdate)
order by DATEFIELD ASC)
and rownum <= 7

「順序」を削除すると、ID が正常に返され、クエリは機能しますが、正しい順序ではありません。私が間違っていることを理解できないように見えるので、これについて何か助けていただければ幸いです!

(編集)明確にするために、私は以前にこれを使用していましたが、返された注文は実際にはありませんでした:

select ID
from TABLE
where DATEFIELD >= trunc(sysdate)
and rownum <= 7
order by DATEFIELD 

ありがとう

4

4 に答える 4

10

ROWNUM「関数」の値は、ORDER BY が処理される前に適用されます。そのため、使用した方法では機能しません (同様の説明については、マニュアルを参照してください)。

使用してクエリを制限しROWNUM、ORDER BY が含まれる場合、順序付けは内側の選択で行う必要があり、制限は外側の選択に適用する必要があります。

select *
from (
  select *
  from table
  where datefield >= trunc(sysdate)
  order by datefield ASC
)
where rownum <= 7
于 2012-08-09T11:22:41.680 に答える
3
  1. サブクエリの種類でorder byは使用できません。where id in (select id from ...)とにかく意味がありません。この条件idは、がサブクエリ内にあるかどうかのみをチェックします。出力の順序に影響する場合、それは単なる偶発的なものです。データが異なると、クエリの実行計画が異なる可能性があり、出力順序も異なる場合があります。order byメイン クエリの最後で明示的に使用します。

  2. rownumとうまくいかないのは、Oracleのよく知られた「機能」ですorder by。詳細については、 http://www.adp-gmbh.ch/ora/sql/examples/first_rows.htmlを参照してください。あなたの場合、次のようなものを使用する必要があります。

    SELECT ID
    FROM (select ID, row_number() over (order by DATEFIELD ) r
        from table
        where DATEFIELD >= trunc(sysdate))
    WHERE r <= 7
    

以下も参照してください。

SOに関する他の同様の質問も参照してください。

于 2012-08-09T11:31:39.323 に答える
1

外部クエリは内部クエリのORDERを「見る」ことができません。この場合、内部クエリは、WHEREで使用されるデータのサブセットを作成するためにのみ使用されているため、内部の順序は意味がありません。外側のものなので、このサブセットの順序は重要ではありません。

多分あなたがやりたいことをもっとよく説明すれば、私たちはあなたを助けることができます

于 2012-08-09T11:28:13.340 に答える