如何Stuff和’For Xml Path’在Sql Server中工作

表是:
+----+------+
| Id | Name |
+----+------+    
| 1  | aaa  |
| 1  | bbb  |
| 1  | ccc  |
| 1  | ddd  |
| 1  | eee  |
+----+------+

所需输出

+----+---------------------+
| Id |        abc          |
+----+---------------------+ 
|  1 | aaa,bbb,ccc,ddd,eee |
+----+---------------------+

查询

SELECT ID,abc = STUFF(
                 (SELECT ',' + name FROM temp1 FOR XML PATH ('')),1,''
               ) 
FROM temp1 GROUP BY id

查询正常工作。但我只需要解释它是如何工作的,还是有任何其他或短的方法来做到这一点。

我很困惑地理解这一点。

下面是它的工作原理:

1.使用FOR XML获取XML元素字符串

将FOR XML PATH添加查询结尾时,可以将查询的结果作为XML元素输出,其中元素名称包含在PATH参数中。例如,如果我们运行以下语句:

SELECT ',' + name 
              FROM temp1
              FOR XML PATH ('')

通过传入一个空白字符串(FOR XML PATH(”)),我们得到以下代替:

,aaa,eee

2.使用STUFF删除前导逗号

STUFF语句逐字地将一个字符串“填充”到另一个字符串中,替换第一个字符串中的字符。然而,我们只是使用它来删除结果值列表的第一个字符。

SELECT abc = STUFF((
            SELECT ',' + NAME
            FROM temp1
            FOR XML PATH('')
            ),'')
FROM temp1

STUFF的参数有:

>要填充的字符串(在我们的例子中是一个完整的名字列表
引号逗号)
>开始删除和插入字符的位置(1,我们填充到空白字符串中)
>要删除的字符数(1,为前导逗号)

所以我们最终得到:

aaa,eee

3.加入id以获得完整的列表

接下来,我们只需要在临时表中的id列表中加入这个,就可以得到一个名字为id的ID列表:

SELECT ID,abc = STUFF(
             (SELECT ',' + name 
              FROM temp1 t1
              WHERE t1.id = t2.id
              FOR XML PATH ('')),'') from temp1 t2
group by id;

我们有我们的结果:

-----------------------------------
| Id        | Name                |
|---------------------------------|
| 1         | aaa,eee |
-----------------------------------

希望这可以帮助!

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...