Oracle ROWNUM伪列

时间:2008-10-01 21:10:14

标签: oracle rownum

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

6 个答案:

答案 0 :(得分:11)

有没有理由不能做到

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

答案 1 :(得分:3)

你可以把它作为子查询来做,所以有:

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

这可能会奏效......不知道是否有更好的东西。

答案 2 :(得分:0)

您可以使用内联查询吗?即

SELECT cols, ROWNUM
FROM   (your query)

答案 3 :(得分:0)

假设您的查询已按您所希望的方式排序,并且您只需要一个数字来表示订单中的哪一行:

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

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

答案 4 :(得分:0)

我有时会做类似的事情:

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

答案 5 :(得分:0)

如果你想使用ROWNUM做任何事情而不是限制查询中返回的总行数(例如AND ROWNUM&lt; 10),你需要别名ROWNUM:

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