代码之家  ›  专栏  ›  技术社区  ›  Igor Drincic

Oracle rownum伪列

  •  3
  • Igor Drincic  · 技术社区  · 18 年前

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

    6 回复  |  直到 11 年前
        1
  •  11
  •   Justin Cave    18 年前

    你有什么理由不能这么做吗?

    SELECT rownum, a.* 
      FROM (<<your complex query including GROUP BY and ORDER BY>>) a
    
        2
  •  3
  •   Allan    11 年前

    您可以将其作为子查询来执行,因此可以:

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

    那可能会奏效…不知道还有没有比这更好的。

        3
  •  0
  •   cagcowboy    18 年前

    您可以使用在线查询吗?工业工程

    SELECT cols, ROWNUM
    FROM   (your query)
    
        4
  •  0
  •   Mark Roddy    18 年前

    假设您的查询已经按照您希望的方式排序,并且您只需要一个数字来指示它的顺序中的哪一行:

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

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

        5
  •  0
  •   Osama Al-Maadeed    17 年前

    有时我也会做一些类似的事情:

    SELECT * FROM
    (SELECT X,Y FROM MY_TABLE WHERE Z=16 ORDER BY MY_DATE DESC)
    WHERE ROWNUM=1
    
        6
  •  0
  •   Aleksander Blomskøld    13 年前

    如果要使用rownum执行的操作超过限制查询中返回的行总数(例如和rownum<10),则需要将rownum别名为:

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