我是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+个这样的人,因此在这种情况下解决方案应该不会失败!
任何帮助将不胜感激。
提前致谢。
尝试XMLAGG像这样使用:
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中添加一个子句:
order by
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;