sql - 使用Oracle LISTAGG函数消除重复项

标签 sql oracle plsql analytics oracle11gr2

Possible Duplicate:
LISTAGG in oracle to return distinct values




我正在使用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   NameA, NameA, NameB, NameC, NameD, Name D


我想返回的是:

1    1   NameA, NameB, NameC, Name D

最佳答案

由于评论中的链接答案没有提供我所喜欢的解决方案,因此无论如何我都会发布它。

我只将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的想法)

关于sql - 使用Oracle LISTAGG函数消除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623713/

相关文章:

SQL:索引/分组具有双重清除条件的事件

mysql - 按输出限制分组

c# - 检测 Oracle 连接泄漏的最佳方法?

oracle - 使用 %ROWTYPE 复制和修改 Oracle 记录

sql - 此实现是否符合SQL-92?

sql - T-SQL 中的 case 语句中断

mysql - MySQL 错误加入 WHERE 子句

sql - Oracle 11g 日志文件,用于查找过去发生的错误的详细信息 (ORA-00054)

database - Spring JDBC BeanPropertyRowMapper 是 否 ('Y' ,'N' ) 到 boolean bean 属性

regex - 使用正则表达式匹配冒号后的所有内容