当前位置: 首页 > 面试题库 >

Oracle 10g中的LISTAGG替代

澹台啸
2023-03-14
问题内容

我是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像这样使用:

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;


 类似资料:
  • 问题内容: 我的客户正在使用不带listagg功能的db2数据库,但是我需要以某种方式在一个字段中聚合主键信息。 现在(对于Oracle),我正在将其用作更大查询的一部分: 从9.7 Fix Pack4版本1开始,还有另一种方法可以在DB2之前的db2数据库中获取listagg函数的结果。 客户数据库的版本:Linux-企业服务器版本9.7,发行号08060107 我通过执行以下选择获得了它: 我

  • 问题内容: listagg是Oracle 11.2中引入的功能!现在,此功能正在分配给我们,我们正在从MySQL迁移到Oracle,我们有以下查询: 据我们所知,Oracle在MySQL下工作正常,在MySQL下运行良好,它会根据需要返回VARCAR而不是CLOB! 文本很大,我们确实需要CLOB ! 这是我试图做的! 创建一个CLOB类型的CLOB_T表! 然后创建函数 现在,如果我运行它: 我

  • 问题内容: 我正在尝试在SQLServer中聚合“ STRING”字段。我想找到与Oracle中相同的函数LISTAGG。 您知道如何执行相同的功能或其他方法吗? 例如, 我希望这个查询的结果是 问题答案: 从SQL Server 2017开始,该功能可用,从而大大简化了逻辑: 在SQL Server中,您可以用来获取结果:

  • 问题内容: 我需要将列转换为行并获取其平均值。 例如,我有此表: 输出应为: 我该如何实现?感谢您的帮助。 问题答案: 如果您使用的是11G,则可以使用: 但是由于您不是,所以您可以伪造它。从本网站改编: 在这两种情况下,内部结构都将行转换为列。在10克中,您只需要自己做即可。在刚刚产生虚值的列表,这必须有足够的覆盖要转换为行(如果你真的有1000,你真的应该重新审视数据模型)的列数。这两个语句使

  • 问题内容: 我需要函数,该函数返回字符串列表。 我在表中有这样的数据: 我需要这样的功能(在oracle中类似的功能): 返回如下内容: 有任何想法吗? 问题答案: 您正在寻找GROUP_CONCAT() 尝试这个: 当然,您可以得到结果。

  • 问题内容: 考虑表学生: 使用以下查询,我们得到: 由此我们将得到: 我们如何得到类似的东西 问题答案: 这应该做的工作