2008-10-01 34 views
3

我有一个复杂的查询与组by和order by子句,我需要一个排序行号(1 ... 2 ...(n-1)... n)与每行返回。使用ROWNUM(值在查询的谓词阶段通过之后但在查询执行任何排序或聚合之前赋值给一行)为我提供了非排序列表(4 ... 567 ... 123 ... 45 ...)。我无法使用应用程序对每行进行计数和分配数字。甲骨文ROWNUM伪列

回答

11

是否有一个原因,你不能只是做

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

嗯,至少不是说我们两个会这样做,哈哈! – Carl 2008-10-01 21:14:11

3

你可以做它作为一个子查询,所以有:

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

这将可能工作...不知道有没有比这更好的东西。

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 
0

如果你想使用ROWNUM做任何事情超过限制的总行数查询(例如AND ROWNUM < 10)你需要返回别名ROWNUM:

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