2013-02-26 4 views
0

Oracle11gКак сохранить порядок сортировки rownum при изменении порядка сортировки столбцов?

Я хочу 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 сорта, что и сорт, как, совпадающим это:

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

Что является недостатком использования вложенного?

Вы всегда можете использовать аналитическую функцию 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 
+0

Ницца ... Если у меня есть более сложный запрос, который «сортируется по A, B, C, D, E» и хочет ударить строку row_number() поверх этого, тогда мне нужно убедиться, что раздел row_number() отражает сортировку запроса. .например 'row_number() over (порядок по A, B, C, D, E) ... правильно? – zundarz

+0

@zundarz - Правильно. –

Смежные вопросы