3

次の SQL クエリがあります。

select
     ID, COLUMN1, COLUMN2
from
     (select ID, COLUMN1, COLUMN2, row_number() over (order by 2 DESC) NO from A_TABLE)
where
     NO between 0 and 100

私がやろうとしているのは、クエリの最初の 100 レコードを選択することです

select ID, COLUMN1, COLUMN2 from ATABLE order by 2 DESC

そして、ここに問題があります:

  1. どうやら、order by句は機能していません。クエリを機能させるには、 のorder by 2 DESC直後に別の句を追加する必要があることに気付きました。(...) from ATABLE私が間違っていることはありますか?それとも期待される動作ですか?

  2. where句を追加するにはどうすればよいですか? table の最初の 100 レコードのみを選択する必要があるとしますwhere COLUMN1 like '%value%'。後にwhere句を追加しようとしました(...) from ATABLEが、エラーが発生しました...

ヘルプ?ありがとう。

PS: Oracle 10g R2 を使用しています。

4

5 に答える 5

4

この Oracle FAQ を確認してください。特にこの部分:

  SELECT * 
  FROM (SELECT a.*, rownum RN 
      FROM (SELECT * 
                         FROM t1 ORDER BY key_column) a
         WHERE rownum <=7)
 WHERE rn >=5
于 2009-05-07T14:00:10.807 に答える
2

最初の質問に答えるには:order by句で列番号を使用せず、列名を使用します。2番目の質問を完全には理解していません。最も内側のSELECTにWHEREを追加すると、次のトリックが実行されるはずだからです。

select ID
,      COLUMN1
,      COLUMN2
from  (select ID
       ,      COLUMN1
       ,      COLUMN2
       ,      row_number() over (order by COLUMN1 DESC) NO
       from   A_TABLE
       where  COLUMNX LIKE '%SOME VALUE%'
      )
where  NO between 0 and 100

PS(willcodejavaforfoodへ)行を並べ替える場合は、row_number()を使用する方が良いと思います。それは内部の見方を保存します(読みやすさのための大きな勝利)。

于 2009-05-07T14:23:25.073 に答える