Frage

Oracle11g

I want rownum to appear in order (smallest to largest) regardless of the sort order of the columns. I can achieve this by sending query through a sub-select as shown in this Query.

Question: Is there any other way to keep rownum sort independent of the 'order by' clause?

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)

If I don't do the sub-select, then my rownum sorts as the colum sorts like this:

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.
War es hilfreich?

Lösung

What is the downside of using an inline view?

You can always use the row_number analytic function rather than the rownum pseudocolumn. But that requires that you put your ORDER BY in two different places

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

That works regardless of the sort order as long as your analytic function ORDER BY matches the ORDER BY in the outer query

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top