使用 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)