3

重複の可能性:
Oracle の LISTAGG で個別の値を返す

Oracle LISTAGG 関数を使用していますが、返された名前のリスト内で、実際には重複を排除し、個別の値のみを返したいと考えています。

私が持っているクエリは次のようなものです:

select a.id,
       a.change_id,
       LISTAGG(b.name, ',') WITHIN GROUP (ORDER BY b.name) AS "Product Name", 
from   table_a a,
       table_b b
where  a.id = 1
and    b.change_id = c.change_id
group by a.id, a.change_id

現時点では、返されています (1 つのレコードのみを表示しています)。

1    1   NameA, NameA, NameB, NameC, NameD, Name D

私が返したいのは:

1    1   NameA, NameB, NameC, Name D
4

1 に答える 1

1

コメント内のリンクされた回答は私の好みの解決策を提供しないため、とにかく投稿します。

概念を示すためにダミーデータのみを使用table_bします。結合などを簡単に追加できます。

with table_b as ( -- dummy data
 select 'name'||mod(level,3) name
        ,mod(level,3) id
   from dual
  connect by level < 10
 union all
 select 'name'||mod(level,2) name
        ,mod(level,3) id
   from dual
  connect by level < 10
)
select id
      ,RTRIM (
              XMLAGG (
                      XMLELEMENT (E,XMLATTRIBUTES (name|| ',' AS "Seg")
                      )
                     ORDER BY name ASC
              ).EXTRACT ('./E[not(@Seg = preceding-sibling::E/@Seg)]/@Seg'),
              ','
             ) AS "Product Name"
       ,LISTAGG(b.name, ',') WITHIN GROUP (ORDER BY b.name) AS "Product Name with dups"
  from table_b b
group by id;

( https://forums.oracle.com/forums/thread.jspa?messageID=9634767&tstart=0#9943367からのアイデア)

于 2012-07-24T07:02:30.887 に答える