保证Oracle SQL查询中的顺序顺序

时间:2012-12-03 00:11:01

标签: sql oracle indexing

我正在编写一个查询,以便为接下来的5个最小项提供一个大于一个值的值,这是主键(例如101)。在这种情况下,Id是char(19),Id是聚集索引。

我对查询的尝试如下:

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

我想保证返回的5个结果是表中大于101的5个最大ID,而不是首先遇到的5个最大结果。因此我在查询中添加了一个Order by。我知道rownum是在where子句之后但在执行order by之前分配的。

我的查询/逻辑是否正确?我是否要求订购条款在那里?

3 个答案:

答案 0 :(得分:2)

如果你想要最大的5个,你需要按顺序降序。您还可以合并两个内部查询:

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

如果您实际上意味着大于100的5个最小ID,那么坚持升序。

在包含数字的字符字段上执行的操作可能不是您所期望的,它将按字母顺序而不是数字顺序执行。所以201将大于1000000。

Example of weird ordering

如果您想进行数字比较,请将where过滤器更改为To_Number(ID) >= 101(或者更好的是将列更改为数字类型)

答案 1 :(得分:0)

您不需要三个SELECTS:

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

在WHERE ROWNUM&lt; = 5的外部SELECT中包裹它,如果需要升序则将ORDER BY ID ASC包裹起来。

答案 2 :(得分:0)

SELECT *
FROM
    ( SELECT *
           , ROW_NUMBER() OVER(ORDER BY ID) AS rn 
      FROM PERSON
      WHERE ID >=  '101'
    ) tmp
WHERE rn <= 5 ;