【问题标题】:Guaranteeing sequential order in Oracle SQL query保证Oracle SQL查询中的顺序
【发布时间】:2012-12-03 00:11:01
【问题描述】:

我正在编写一个查询,以提供大于一个值的下 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 子句吗?

【问题讨论】:

    标签: sql oracle indexing


    【解决方案1】:

    如果您想要最大的 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) &gt;= 101(或者最好将列更改为数字类型)

    【讨论】:

    • 此查询没有任何排序。内部排序丢失。
    • 我是指大于 101 的 5 个最小 ID。
    【解决方案2】:

    您不需要三个 SELECTS:

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

    使用 WHERE ROWNUM

    【讨论】:

    • 我不确定 Oracle 是否有 Limit
    【解决方案3】:
    SELECT *
    FROM
        ( SELECT *
               , ROW_NUMBER() OVER(ORDER BY ID) AS rn 
          FROM PERSON
          WHERE ID >=  '101'
        ) tmp
    WHERE rn <= 5 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2021-11-24
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多