内部查询中的按子句排序

时间:2019-05-13 14:10:22

标签: sql database oracle database-administration

我有一个场景。我需要在两列中使用listagg,以逗号分隔数据。我在查询中有别名,因此我不能使用listagg中必需的group by。为了解决这个问题,我在外部查询中使用输出,并在那里使用listagg并对列进行分组。

问题是我的数据是按不在select子句中的列排序的。如何在外部查询中维护内部查询的数据顺序。 或者

是否有可能使外部查询中的列用于排序,而不是在select子句中使用。

我的查询就像

    select A+10 AA,
    B*20 BB,
    CC ,
    DD
    from Tab1 order by M;

当我使用listagg时,我修改了查询

    select
    AA,
    BB
    listagg(CC,',') within group(order by CC),
    listagg(DD,',') within group(order by DD)
    from
    (
    select A+10 AA,
    B*20 BB,
    CC ,
    DD
    from Tab1 order by M
    )
     group by AA,BB

如果您可以清楚地看到,我们的内部查询被select子句中没有的M列烦恼。如何在不接受外部查询的情况下维持order by M,或者如果我在外部查询中采用M列,那么如何排除结果。

或者当我有别名时,是否有可能在内部查询中使用listagg

1 个答案:

答案 0 :(得分:1)

您可以在分组时使用别名,也可以使用未显示的列进行排序。 唯一的限制是,当不按分组时,需要汇总要排序的列(summaxmin等)。

with testtab as (
  select 1 "AA", 10 "BB", 'aval1' "CC", 'bval1' "DD", 5 "SORTV" from dual
  union all select 2, 10, 'aval2', 'bval2', 4 "SORTV" from dual
  union all select 2, 30, 'aval3', 'bval3', 3 "SORTV" from dual
  union all select 4, 40, 'aval4', 'bval4', 2 "SORTV" from dual
  union all select 4, 40, 'aval5', 'bval5', 1 "SORTV" from dual)
select aa + 10 as "AA",
  bb * 20 as "BB",
  listagg(cc, ', ') within group (order by cc),
  listagg(dd, ', ') within group (order by dd)
from testtab
group by aa, bb
order by max(SORTV) asc

收益

AA     BB   LISTAGG(CC,',')WITHINGROUP(ORDERBYCC)     LISTAGG(DD,',')WITHINGROUP(ORDERBYDD)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
---------------------------------------------------------------------------------------
14     800  aval4, aval5                              bval4, bval5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
12     600  aval3                                     bval3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
12     200  aval2                                     bval2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
11     200  aval1                                     bval1