2

我正在编写一个查询,以提供大于一个值的下 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 执行之前分配的。

我的查询/逻辑是否正确?我需要 order by 子句吗?

4

3 回答 3

2

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

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
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 回答
0

为此,您不需要三个 SELECTS:

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

如果需要升序,则将其包装在 WHERE ROWNUM <= 5 的外部 SELECT 和 ORDER BY ID ASC 中。

于 2012-12-03T00:17:22.647 回答