一尘不染

Oracle 10g中的LISTAGG替代

sql

我是Oracle的新手。卡在下面:我有下面的2表:

地点:

**SiteID|SiteName** 
1      Sydney
2      Newyork
3      Delhi

人们:

**RecordID|PeopleID|SiteID**
1         1        1
2         1        2
3         2        2
4         3        1
5         3        2
6         3        3

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

**PeopleID | AssignedSites**
1          Sydney,NewYork
2          Newyork
3          Sydney,NewYork,Delhi
  • 还有几点:

-该解决方案应该在Oracle 10g和11g中都可以使用。

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

任何帮助将不胜感激。

提前致谢。


阅读 173

收藏
2021-03-10

共1个答案

一尘不染

尝试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;

如果您需要按特定顺序进行连接,例如按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;

编辑:

如果要显示分配给站点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;
2021-03-10