我正在编写一个查询,以便为接下来的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之前分配的。
我的查询/逻辑是否正确?我是否要求订购条款在那里?
答案 0 :(得分: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
(或者更好的是将列更改为数字类型)
答案 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 ;