我在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中那么热。
答案 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