2

主キー(例:101)である値よりも大きい次の5つの最小アイテムを指定するクエリを作成しています。この場合、Idはchar(19)であり、Idはクラスター化されたインデックスです。

クエリでの私の試みは次のとおりです。

SELECT *
(SELECT *
(SELECT * FROM 
PERSON
ORDER BY ID)
WHERE ID >=  '101')
WHERE rownum <= 5

返される5つの結果が、最初に検出される5つの最大の結果ではなく、101より大きいテーブル内の5つの最大のIDであることを保証したいと思います。したがって、クエリにOrderbyを追加しました。rownumは、where句の後、orderbyが実行される前に割り当てられることを知っています。

私のクエリ/ロジックは正しいですか?order by句が存在する必要がありますか?

4

3 に答える 3

2

5つ大きいものが必要な場合は、降順で並べ替える必要があります。2つの内部クエリをマージすることもできます。

Select
  *
From (
  Select
    * 
  From
    Person
  Where 
    ID >= '101'
  Order By
    ID Desc
  ) a
Where
  rownum <= 5

実際に100より大きい5つの最小IDを意味する場合は、昇順を使用してください。

数字を含む文字フィールドよりも多くのことを行うと、期待どおりに行われない可能性があります。数字ではなくアルファベットの順序になります。したがって、201は1000000より大きくなります。

奇妙な順序の例

数値比較が必要な場合は、whereフィルターを変更しますTo_Number(ID) >= 101(または、列を数値型に変更することをお勧めします)

于 2012-12-03T00:15:23.330 に答える
0

これには3つのSELECTは必要ありません。

SELECT * FROM PERSON WHERE ID >= '101' ORDER BY ID DESC

これをWHEREROWNUM<= 5の外部SELECTでラップし、昇順が必要な場合はORDER BYIDASCでラップします。

于 2012-12-03T00:17:22.647 に答える
0
SELECT *
FROM
    ( SELECT *
           , ROW_NUMBER() OVER(ORDER BY ID) AS rn 
      FROM PERSON
      WHERE ID >=  '101'
    ) tmp
WHERE rn <= 5 ;
于 2012-12-03T01:09:03.810 に答える