【问题标题】:Listagg in a subquery in select clause returns null选择子句中的子查询中的 Listagg 返回 null
【发布时间】:2019-10-04 07:05:01
【问题描述】:

我有一个特定的查询,其中查询的结果包含 start_value,step,range 类型的值。我想从每个级别的 start_value 添加步骤开始创建所有可能值的列表,直到级别达到范围。 例如。

start_value = 8
step = 1
range = 5

然后我想要 (8,9,10,11,12) 作为结果。

为此,我使用以下代码,但 listagg 部分返回 null。请注意,具有别名 main_query 的查询会实时不同,并且会有多行。仅出于演示目的,我在那里使用双重。 listagg 部分也将保持不变。

    select val,step,rang ,
    (select  listagg(colval) within group(order by colval) from
    (select  val + level*step as colval from dual
    connect by level <= rang+1))
    from
    (select 1 as val , 2 as step , 3 rang from dual) main_query;

编辑:

非常感谢快速回复的人。问题是已经有一个 with 子句被 main_query 本身使用。因此,根据提出的解决方案,这将是现在

WITH main_query as (

with query_1 as 
(select ... from ..),
query_2 as 
(select ... from ...),
select val,step,range from 
(select .... from query_1 join query_2 ....)main_query) 
select <values to be created using listagg> from main_query ;

我不确定这是否可行。如果认为可行,请告诉我。

【问题讨论】:

    标签: sql oracle listagg


    【解决方案1】:

    使用connect bylistagg 如下:

    SQL> WITH MAIN_QUERY AS (
      2      SELECT
      3          8 AS VAL,
      4          1 AS STEP,
      5          5 RANG
      6      FROM
      7          DUAL
      8  )
      9  SELECT
     10      LISTAGG(VAL +((LEVEL - 1) * STEP), ',') WITHIN GROUP(
     11          ORDER BY
     12              LEVEL
     13      ) AS RESULT
     14  FROM
     15      MAIN_QUERY
     16  CONNECT BY
     17      LEVEL <= RANG;
    
    RESULT
    --------------------------------------------------------------------------------
    8,9,10,11,12
    
    SQL>
    

    对于不同的值:

    SQL> WITH MAIN_QUERY AS (
      2      SELECT
      3          1 AS VAL,
      4          2 AS STEP,
      5          3 RANG
      6      FROM
      7          DUAL
      8  )
      9  SELECT
     10      LISTAGG(VAL +((LEVEL - 1) * STEP), ',') WITHIN GROUP(
     11          ORDER BY
     12              LEVEL
     13      ) AS RESULT
     14  FROM
     15      MAIN_QUERY
     16  CONNECT BY
     17      LEVEL <= RANG;
    
    RESULT
    --------------------------------------------------------------------------------
    1,3,5
    
    SQL>
    

    干杯!!

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      使用 with 语句。

         with main as
       (select 8 as start_value , 1 as step , 5 range from dual)
      ,sub as ( SELECT   LEVEL   AS colval
                            FROM main 
                      CONNECT BY LEVEL  < start_value+range*step
        )
      ,sub2 as(
      select * from
      sub,main
      where colval>=start_value
      )
      select listagg(colval,',') within group(order by colval)  from
      sub2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多