Oracle ROWNUM伪列

3

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

6个回答

11

是否有理由你不能只做

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

3
您可以将其作为子查询来执行,如下所示:
select q.*, rownum from (select... group by etc..) q

那可能会起作用...不确定是否有比这更好的方法。


0

如果你想使用 ROWNUM 做更多的事情,而不仅仅是在查询中限制返回的总行数(例如 AND ROWNUM < 10),那么你需要给 ROWNUM 起一个别名:

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

0

你能使用内联查询吗?例如

SELECT cols, ROWNUM
FROM   (your query)

0
假设您的查询已按您所需的方式排序,并且您只想要一个数字来指示它在顺序中的行号:
SELECT ROWNUM AS RowOrderNumber, Col1, Col2,Col3...
FROM (
    [Your Original Query Here]
)

并将“Colx”替换为您查询中的列名称。


0

我有时也会做这样的事情:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接