将多行连接到一个字符串中

时间:2012-10-17 11:06:38

标签: sql oracle oracle10g string-aggregation

我在Oracle中有两个表:table1和table2(我们有一个非常缺乏想象力的DBA!)

table1具有列ID(以及其他一些)。

table2有列id,table1id和代码。 table1id是table1的外键。

通常每个table1行有1个table2行,但有时table1行有2个table2行,偶尔会有3行。

我需要的是每个table1行的单个'code'值。如果有多个相应的table2行,我需要返回所有值的连接字符串,因此结果可能如下所示:

table1.id     code
1             a
2             b
3             a b
4             a b c

知道如何实现这一目标吗? 如果它是SQL Server我会写一个函数,虽然这会比我想要的慢。 但是我在Oracle中并不像在SQL Server中那么热。

2 个答案:

答案 0 :(得分:3)

您没有指定Oracle的版本。如果您使用的是Oracle 11g,则可以使用LISTAGG()函数:

select t1.id,
    listagg(t2.code, ' ') within group(order by t1.id) code
from table1 t1
left join table2 t2
    on t1.id = t2.id
group by t1.id

如果您使用的是Oracle 10g,则可以使用WM_CONCAT

select t1.id,
    WM_CONCAT(t2.code) code
from table1 t1
left join table2 t2
    on t1.id = t2.id
group by t1.id

答案 1 :(得分:1)

@bluefeet有正确的解决方案,但是如果你是10g并且由于某种原因不想使用WM_CONCAT(例如,没有记录),还有另一个:

select t1.id, 
   RTRIM(XMLAGG(XMLELEMENT(e,code,',').EXTRACT('//text()')),',') code 
from table1 t1
left join table2 t2 
   on t1.id = t2.id
group by t1.id