Oracle ROWNUM伪列

时间:2020-03-06 14:59:53  来源:igfitidea点击:

我有一个使用group by和order by子句的复杂查询,并且我需要每行返回一个排序的行号(1 ... 2 ...(n-1)... n)。使用ROWNUM(在通过查询的谓词阶段之后但在查询进行任何排序或者聚合之前,将值分配给行)给了我一个未排序的列表(4 ... 567 ... 123 ... 45 ...)。我无法使用应用程序对每一行进行计数和分配数字。

解决方案

是否有我们不能做的原因

SELECT rownum, a.* 
  FROM (<<your complex query including GROUP BY and ORDER BY>>) a

我们可以将其作为子查询来执行,因此请执行以下操作:

select q.*, rownum from (select... group by etc..) q

那可能行得通...不知道还有什么比这更好的了。

我们可以使用内联查询吗? IE

SELECT cols, ROWNUM
FROM   (your query)

假设我们已经按照所需的方式对查询进行了排序,并且只需要一个数字来指示查询的顺序是:

SELECT ROWNUM AS RowOrderNumber, Col1, Col2,Col3...
FROM (
    [Your Original Query Here]
)

并将" Colx"替换为查询中列的名称。

我有时也会做类似的事情:

SELECT * FROM
(SELECT X,Y FROM MY_TABLE WHERE Z=16 ORDER BY MY_DATE DESC)
WHERE ROWNUM=1

如果我们想使用ROWNUM做更多事情来限制查询中返回的总行数(例如AND ROWNUM <10),则需要给ROWNUM加上别名:

select * 
   (select rownum rn, a.* from 
          (<sorted query>) a))
 where rn between 500 and 1000