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 多个这样的人,因此在这种情况下解决方案不应中断!
任何帮助将不胜感激。
提前致谢。
尝试使用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)