Oracle 10g 中的 LISTAGG 替代方案

use*_*533 5 sql oracle oracle10g

我是 Oracle 的新手。被困在下面:我有以下 2 个表:

地点:

**SiteID|SiteName** 
1      Sydney
2      Newyork
3      Delhi
Run Code Online (Sandbox Code Playgroud)

人们:

**RecordID|PeopleID|SiteID**
1         1        1
2         1        2
3         2        2
4         3        1
5         3        2
6         3        3
Run Code Online (Sandbox Code Playgroud)

现在在我的查询中,我想要这样的输出:

**PeopleID | AssignedSites**
1          Sydney,NewYork
2          Newyork
3          Sydney,NewYork,Delhi
Run Code Online (Sandbox Code Playgroud)
  • 还有几点:

- 该解决方案应该也适用于 Oracle 10g 和 11g。

- 为简洁起见,我在上面的示例中给出了一小部分数据。但是,在我的生产场景中,一个人可以与 1000 多个位置相关联,并且可能有 1000 多个这样的人,因此在这种情况下解决方案不应中断!

任何帮助将不胜感激。

提前致谢。

Gur*_*ngh 8

尝试使用XMLAGG这样的:

select
    p.PeopleID,
    rtrim(xmlagg(xmlelement(e, s.SiteName, ',')).extract('//text()').getclobval(), ',')
from people p
join site s on p.SiteID = s.SiteID
group by p.PeopleID;
Run Code Online (Sandbox Code Playgroud)

如果您需要按特定顺序连接,比如 SiteId 的递增顺序,然后order by在 xmlagg 中添加一个子句:

select
    p.PeopleID,
    rtrim(xmlagg(xmlelement(e, s.SiteName, ',')
                   order by s.SiteId).extract('//text()').getclobval(), ',')
from people p
join site s on p.SiteID = s.SiteID
group by p.PeopleID;
Run Code Online (Sandbox Code Playgroud)

编辑:

如果要显示分配到站点 100 的所有人员的结果:

select p.PeopleID,
    rtrim(xmlagg(
                xmlelement(e, s.SiteName, ',') order by s.SiteId
            ).extract('//text()').getclobval(), ',')
from people p
join site s on p.SiteID = s.SiteID
join (
    select distinct PeopleID
    from people
    where siteID = 1
    ) p2 on p.PeopleID = p2.PeopleID
group by p.PeopleID;
Run Code Online (Sandbox Code Playgroud)