首页 >数据库 >mysql教程 >如何在 SQL Server 和 Oracle 中将多行连接成逗号分隔的列表?

如何在 SQL Server 和 Oracle 中将多行连接成逗号分隔的列表?

DDD
DDD原创
2025-01-21 06:42:12801浏览

How to Concatenate Multiple Rows into a Comma-Separated List in SQL Server and Oracle?

将多个 SQL 行聚合到单个逗号分隔列中

本文演示了如何将共享公共标识符的多行合并为一行,并在特定列中使用逗号分隔的列表。 该示例使用包含工单 ID 和关联个人的表,旨在创建一个结果,其中每个工单 ID 都链接到所有相关个人的列表。

SQL Server 方法(2005 及更高版本)

以下 SQL Server 查询使用 STUFF()ISNULL()FOR XML PATH 实现此目的:

<code class="language-sql">SELECT t.TicketID,
       STUFF(ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma],
       ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty]
  FROM @Tickets t
GROUP BY t.TicketID</code>

此查询使用子查询来收集与每个 TicketID 关联的个体。 FOR XML PATH 方法将结果转换为连接字符串,并且 STUFF() 删除所有前导逗号。 ISNULL() 函数处理没有个人与票证关联的情况。 可选列提供了处理前导逗号的灵活性。

Oracle 解决方案

Oracle 使用 LISTAGG() 函数提供了更简洁的解决方案:

<code class="language-sql">SELECT TicketID,
       LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People
  FROM @Tickets</code>

LISTAGG() 直接将值聚合到以逗号分隔的列表中,并按 Person 列排序。 PARTITION BY 子句确保每个不同的 TicketID 发生聚合。 此方法比 SQL Server 等效方法更简单、更高效。

以上是如何在 SQL Server 和 Oracle 中将多行连接成逗号分隔的列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn