首页 >数据库 >mysql教程 >SQL Server 中的'STUFF”和'FOR XML PATH”如何连接名称以查找重复的 ID?

SQL Server 中的'STUFF”和'FOR XML PATH”如何连接名称以查找重复的 ID?

DDD
DDD原创
2025-01-22 22:52:14949浏览

How Do `STUFF` and `FOR XML PATH` Concatenate Names in SQL Server for Duplicate IDs?

SQL Server:使用 STUFF 和 FOR XML PATH 连接重复 ID 的名称

本指南演示如何连接与 SQL Server 表中重复 ID 关联的多个名称,从而为每个唯一 ID 生成一个以逗号分隔的名称列表。 我们将使用 STUFFFOR XML PATH 的强大组合来实现这一目标。

场景:

想象一个具有重复 ID 和相应名称的表。 目标是创建一个新列,其中包含每个 ID 的所有名称,并用逗号整齐地分隔。

解决方案:

该解决方案采用三步流程:

第 1 步:生成逗号分隔的 XML 字符串

该解决方案的核心在于利用 FOR XML PATH('') 从名称生成逗号分隔的字符串。

<code class="language-sql">SELECT ',' + name
FROM temp1
FOR XML PATH('')</code>

这会生成一个 XML 字符串,其中每个名称前面都有一个逗号。

第 2 步:删除前导逗号

第 1 步生成的 XML 字符串以不必要的逗号开头。 STUFF 优雅地删除它。

<code class="language-sql">STUFF(
  (SELECT ',' + name FROM temp1 FOR XML PATH('')),
  1,
  1,
  ''
)</code>

STUFF 将第一个字符(前导逗号)替换为空字符串。

第 3 步:加入、分组和最终结果

最后,我们将上述步骤与 JOINGROUP BY 子句结合起来以达到预期的结果。

<code class="language-sql">SELECT ID,
  ConcatenatedNames = STUFF(
    (SELECT ',' + name
    FROM temp1 t1
    WHERE t1.id = t2.id
    FOR XML PATH (''))
  , 1, 1, '')
FROM temp1 t2
GROUP BY id;</code>

此查询基于 temp1 将子查询(生成逗号分隔的字符串)与原始表 (ID) 连接起来。 GROUP BY 子句确保每个唯一 ID 都发生串联。 生成的 ConcatenatedNames 列包含每个 ID 的以逗号分隔的名称列表。

以上是SQL Server 中的'STUFF”和'FOR XML PATH”如何连接名称以查找重复的 ID?的详细内容。更多信息请关注PHP中文网其他相关文章!

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