2013-02-26 124 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外部查询

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

尼斯ORDER BY匹配工作的排序顺序不分...如果我有一个更复杂的查询,按'A,B,C,D,E排序',并且想在其上添加一个row_number(),那么我需要确保row_number()部分镜像查询排序。 。例如'row_number()over(按A,B,C,D,E排序)..right? – zundarz 2013-02-26 18:47:44

+0

@zundarz - 正确。 – 2013-02-26 18:48:09