我有一个带有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
那可能会起作用...不确定是否有比这更好的方法。
如果你想使用 ROWNUM 做更多的事情,而不仅仅是在查询中限制返回的总行数(例如 AND ROWNUM < 10),那么你需要给 ROWNUM 起一个别名:
select *
(select rownum rn, a.* from
(<sorted query>) a))
where rn between 500 and 1000
你能使用内联查询吗?例如
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