表是:
- +----+------+
- | 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 |
- -----------------------------------
希望这可以帮助!