如何在更改其他列排序顺序时保持rownum排序顺序?

时间:2013-02-26 18:21:51

标签: sorting oracle11g rownum

Oracle11g的

我希望rownum按顺序出现(从最小到最大),而不管列的排序顺序如何。我可以通过子查询发送查询来实现此目的,如查询

所示

问题:还有其他方法可以让rownum排序独立于'顺序的'子句吗?

with alphabet as
( select 'A' as letters from dual union all
  select 'B' as letters from dual union all 
  select 'C' as letters from dual)
  select rownum, letters from
  (select letters from alphabet
  --    order by  letters -- I can change the sort order here w/o changing rownum sort order.
     order by  letters desc)

如果我不进行子选择,那么我的rownum就像这样的colum排序:

with alphabet as
( select 'A' as letters from dual union all
  select 'B' as letters  from dual union all 
  select 'C' as letters from dual)
  select rownum, letters  from alphabet  
  order by letters desc      -- sorting here alters the rownum sort.

1 个答案:

答案 0 :(得分:1)

使用内联视图有什么缺点?

您始终可以使用row_number分析函数而不是rownum伪列。但这需要您将ORDER BY放在两个不同的地方

with alphabet as
( select 'A' as letters from dual union all
  select 'B' as letters  from dual union all
  select 'C' as letters from dual)
select row_number() over (order by letters desc) rn,
       letters
  from alphabet
 order by letters desc

只要您的分析函数ORDER BY与外部查询中的ORDER BY匹配

,无论排序顺序如何,它都有效
SQL> ed
Wrote file afiedt.buf

  1  with alphabet as
  2  ( select 'A' as letters from dual union all
  3    select 'B' as letters  from dual union all
  4    select 'C' as letters from dual)
  5  select row_number() over (order by letters desc) rn,
  6         letters
  7    from alphabet
  8*  order by letters desc
SQL> /

        RN L
---------- -
         1 C
         2 B
         3 A

SQL> ed
Wrote file afiedt.buf

  1  with alphabet as
  2  ( select 'A' as letters from dual union all
  3    select 'B' as letters  from dual union all
  4    select 'C' as letters from dual)
  5  select row_number() over (order by letters asc) rn,
  6         letters
  7    from alphabet
  8*  order by letters asc
SQL> /

        RN L
---------- -
         1 A
         2 B
         3 C
相关问题