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