使用 LISTAGG 获取值,但避免对内连接中使用的表进行分组

Posted

技术标签:

【中文标题】使用 LISTAGG 获取值,但避免对内连接中使用的表进行分组【英文标题】:Fetching value using LISTAGG but avoid grouping of a table used in Inner join 【发布时间】:2014-04-08 15:42:20 【问题描述】:

您好,我有一个类似的 Oracle 查询

select listagg(name,',') within group (order by name)
from table t1 
inner join table t2 on t1.id=t2.id
inner join table t3 on t1.value=t3.value

但后来我需要从另一个表 t4 中再获取 2 列,所以我加入了 t4,但是当我加入时,listagg 给出了用逗号分隔的重复值

select listagg(name,',') within group (order by name)
from table t1 
inner join table t2 on t1.id=t2.id
inner join table t3 on t1.value=t3.value
inner join table t4 on t1.id=t4.id

我想在不影响 LISTAGG 函数的情况下获取这两个新列。

【问题讨论】:

【参考方案1】:

通过添加连接,您会在结果中得到重复的名称。假设您的联接是正确的,您可以使用 DISTINCT 来解决此问题:

select listagg(name,',') within group (order by name)
from (select distinct name
      from table t1 
      inner join table t2 on t1.id=t2.id
      inner join table t3 on t1.value=t3.value
      inner join table t4 on t1.id=t4.id
)

【讨论】:

这会在 listagg 字段中创建唯一值,但最终输出中的行会有重复行?

以上是关于使用 LISTAGG 获取值,但避免对内连接中使用的表进行分组的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中使用 listagg 时出错“字符串连接太长”

Amazon Redshift 中 LISTAGG 函数的替代方法

oracle行转列,列转行函数的使用(listagg,xmlagg)

如何使用 listagg 运算符,以便查询应该获取逗号分隔的值

oracle 列转行函数listagg判断函数decode

从 CLOB ListAgg 值中删除 Oracle SQL 中的 HTML 代码