1

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

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

table2 有列 id、table1id 和 code。table1id 是 table1 的外键。

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

我需要的是每个 table1 行的单个“代码”值。如果有多个对应的 table2 行,我需要返回所有值的串联字符串,因此结果可能如下所示:

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

知道如何实现吗?如果是 SQL Server,我会编写一个函数,尽管这会比我想要的要慢。但是,我在 Oracle 中的热度不如在 SQL Server 中的热度。

4

2 回答 2

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
于 2012-10-17T11:10:46.073 回答
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
于 2012-10-17T11:55:08.923 回答