【问题标题】:Retrieve distinct values with LISTAGG in Oracle 12C [duplicate]在 Oracle 12C 中使用 LISTAGG 检索不同的值 [重复]
【发布时间】:2019-10-25 14:28:24
【问题描述】:

我正在尝试使用 oracle 12C 中的 LISTAGG、LISTAGG(distinct... ) 解决了 19c 的问题,但我必须使用 12c。

Unexpected result

我使用这个查询得到了上面的结果:


   SELECT
          T.c1 A,
          T.c2 B,
          LISTAGG( TI.CODE , ';' ) WITHIN GROUP (ORDER BY  TI.CODE) AS  COLUMNX1,
          LISTAGG( TE.CODE, ' ;') WITHIN GROUP (ORDER BY  TE.CODE ) AS COLUMNX2,    
          LISTAGG(TR.CODE, '; ') WITHIN GROUP (ORDER BY TR.CODE ) AS COLUMNX3
   FROM  TABLE1 T
          INNER join  TABLE_I TI on  TI.fk_c2 = T.c2
          INNER join  TABLE_E TE on TE.fk_c2 = T.c2
          INNER join TABLE_R TR on TR.fk_c2 = T.c2
          WHERE T.d = *parameter*
          GROUP BY
          T.c1,
          T.c2;

我想找回这个:

Expected result

不应检索黄色标记的字符串。

在查询结果的每一行中,COLUMNX1、COLUMNX2、COLUMNX3 列具有相同数量的连接字符串,这就是我遇到重复问题的原因。

此外,TABLE_I、TABLE_E 和 TABLE_R 都有一个引用 TABLE1.c2 的外键 fk_c2

编辑:

我添加了一个 with 子句来首先检索不同的值,然后我将它加入到我的 select 语句中

使用此查询检索预期结果


WITH TEMP AS (

     SELECT fk_c2, LISTAGG(code, ',')  WITHIN GROUP (ORDER BY code) AS X1 
     FROM (
          SELECT DISTINCT * 
          FROM TABLE_I
          GROUP BY fk_c2 ) COLUMNX1

     INNER JOIN
    (SELECT fk_c2, LISTAGG(code, ',') WITHIN GROUP (ORDER BY code) AS X2
      FROM (
           SELECT DISTINCT * 
           FROM TABLE_E)
           GROUP BY fk_c2 ) COLUMNX2
     ON COLUMNX1.fk_c2 = COLUMNX2.fk_c2

     INNER JOIN
    (SELECT fk_c2, LISTAGG(code, ',') WITHIN GROUP (ORDER BY code) AS X3
     FROM(
          SELECT DISTINCT * 
          FROM TABLE_R)
          GROUP BY fk_c2 ) COLUMNX3    
     ON COLUMNX1.fk_c2 = COLUMNX3.fk_c2
       )

     SELECT
         T.c1 A,
         T.c2 B,
         tmp.X1,
         tmp.X2,
         tmp.X3
  FROM  TABLE1 T
         INNER join  temp tmp on  tmp.fk_c2 = T.c2
         WHERE T.d = *parameter*
         GROUP BY
         T.c1,
         T.c2
         tmp.X1,
         tmp.X2,
         tmp.X3;

【问题讨论】:

    标签: oracle oracle12c listagg


    【解决方案1】:

    您需要额外的步骤:首先找到不同的值,然后聚合它们。例如:

    SQL> with test (id, col) as
      2    (select 1, 'x' from dual union all
      3     select 1, 'x' from dual union all
      4     --
      5     select 2, 'w' from dual union all
      6     select 2, 't' from dual union all
      7     select 2, 'w' from dual union all
      8     --
      9     select 3, 'i' from dual
     10    ),
     11  -- first find distinct values ...
     12  temp as
     13    (select distinct id, col from test)
     14  -- ... then aggregate them
     15  select id,
     16         listagg(col, ';') within group (order by col) result
     17  from temp
     18  group by id;
    
            ID RESULT
    ---------- ----------
             1 x
             2 t;w
             3 i
    
    SQL>
    

    【讨论】:

    • 非常感谢,当我使用 With 子句时,它确实有效,我首先检索所有不同的值,然后在我的 select 语句中进行连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多