gpt4 book ai didi

sql - Oracle 10g 中的 LISTAGG 替代方案

转载 作者:行者123 更新时间:2023-12-04 13:53:40 25 4
gpt4 key购买 nike

我是 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。

    - 为简洁起见,我在上面的示例中给出了一小部分数据。但是,在我的生产场景中,一个人可以与 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;

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

    关于sql - Oracle 10g 中的 LISTAGG 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42609917/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com