查询结果集合成一列的sqlserver实现方法stuff
- 2019 年 10 月 30 日
- 笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo4105/article/details/51778698
我有个需求如下图

表的结构关系

网上找了一下资料,发现可以用stuff+for xml path('')
for xml path('')的作用是将字符串先拼成一个
SELECT *, RLCD = (select ',' + RLCD from WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD for xml path('')), RLNM=(select ',' + RLNM from WQ_ROLE_B WHERE RLCD IN(SELECT RLCD FROM WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD) for xml path('')) FROM WQ_USER_B
得到的结果如下,但出现一个小问题,就是前面会多出一个","号,如下图

这时,可以用stuff()去除逗号
关于STUFF的介绍 STUFF ( character_expression , start , length ,character_expression ) 参数 character_expression 一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。 start 一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。start 可以是 bigint 类型。 length 一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。length 可以是 bigint 类型。 返回类型 如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。 备注 如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。 如果结果值大于返回类型支持的最大值,则产生错误。 |
---|
我只要把第一个字符串改成空字符串就可以了,代码如下
SELECT *, RLCD = (select ',' + RLCD from WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD for xml path('')), RLNM=stuff((select ',' + RLNM from WQ_ROLE_B WHERE RLCD IN(SELECT RLCD FROM WQ_USERROLE_B WHERE URCD=WQ_USER_B.URCD) for xml path('')) , 1 , 1 , '') FROM WQ_USER_B
这样就得到了我想要的结果,大功告成