为什么多行没有连接?

时间:2015-10-15 20:24:56

标签: sql oracle11g

我将这些数据放在一个表中:

ID      ANIMAL
555000  Dog
555000  Cow
555000  Fox
657000  Fox
817900  Dog
817900  Fox
829800  Fox
830300  Fox
830600  Fox
830800  Fox
831100  Dog
831100  Fox
839900  Fox

我需要创建按ID分组的输出,然后创建Id动物的分隔字符串。鉴于上述数据,我需要以下输出。请注意,每个ID应该是结果集中的单个行,并且动物应该连接成每个ID的单个字符串。我不打算创建一个大的连接字符串。

555000  Dog<br/>Cow<br/>Fox
657000  Fox
817900  Dog<br/>Fox
829800  Fox
830300  Fox
830600  Fox
830800  Fox
831100  Dog<br/>Fox
839900  Fox

这是我到目前为止的SQL。它为每个ID,ANIMAL组合生成一行。问题是ANIMAL字段中的值没有被连接。我做错了什么?

select ID,
        REPLACE (wm_concat (DISTINCT ANIMAL),',','<br/>')
from TheTable
group by ID, ANIMAL

2 个答案:

答案 0 :(得分:1)

使用LISTAGG分析函数:

SELECT ID, LISTAGG(ANIMAL, '<br/>') WITHIN GROUP (ORDER BY ANIMAL) animals
FROM   TheTable
GROUP BY ID;

注意:您将被限制为4000 字节

编辑:

字符串聚合技术有很好的资源:

https://oracle-base.com/articles/misc/string-aggregation-techniques#user_defined_aggregate_function

答案 1 :(得分:0)

一种方法是使用XMLAGG / XMLELEMENT而不是LISTAGG(这将避免可怕的ORA-01489:字符串连接的结果太长):

select ID, 
  RTRIM(XMLAGG(XMLELEMENT(E,
                          t.animal || ',')).EXTRACT('//text()').getclobval(),
        ',') as animals
from theTable t
group by ID

  • 将每只动物转换为XML节点(使用XMLELEMENT
  • 使用XMLAGG和字符串连接运算符||
  • 聚合XML元素
  • 使用EXTRACTgetClobVal()
  • 删除XML内容
  • 删除带有RTRIM
  • 的逗号逗号

SQL Fiddle

使用XMLCAST代替EXTRACT / getClobVal时,IIRC会有一种更优雅的方式,但我现在无法访问我的代码库来检查它。