转:利用 T-sql 的从句 for xml path(”) 达成多行统一到一行, 并带有分隔符

发布时间:2019-03-30  栏目:SQL  评论:0 Comments

docs.microsoft.com 链接:  [SQL 

http://blog.csdn.net/rav009/article/details/50723307

](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/stuff-transact-sql?view=sql-server-2017)**一个应用场景与FOR
XML PATH应用**

T-sql 有四个for xml
path(”)的从句能把多行结果合并到一行,并成为xml 格式

 

譬如有一张表tb有两列,其格式和数量为:

率先呢!大家在大增一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好!那么以往表结构如下:

**

 

**

           manbet手机客户端3.0 1

manbet手机客户端3.0,id value
—————
1 aa
1 bb
2 aaa
2 bbb
2
ccc**

 

若果对其推行sql: select id, value from tb for xml path(‘tbnode’)
则赶回的结果集仅为一行一列:

       
这时,大家的必要是查询学生表,呈现全部学员的喜好的结果集,代码如下:

<tbnode><id>1</id><value>aa</value><id>1</id><value>bb</value>……..<id>2</id><value>ccc</value></tbnode>

 

近来大家取巧一点, 省略path括号里的剧情,
同时把那两列想艺术变成匿名列,sql如下:

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT sName,
(SELECT hobby+',' FROM student 
  WHERE sName=A.sName 
  FOR XML PATH('')) AS StuList
FROM student A 
GROUP BY sName
) B 

 

       
 结果如下:manbet手机客户端3.0 2

  1. select id+”,value+” from tb for xml path(”)    
    //在path(“”) 不写任刘毛毛西会自动生成二个行列标识符

  2. 这就是说重临结果如下(也是两个一行一列):

    1aa1bb2aaa2bbb2ccc

  3. manbet手机客户端3.0 3

    依照那样的思路,
    以往要对持有分化的ID的value实行统一,希望获得如下的结果集:

    id value
    —————
    1 aa,bb
    2 aaa,bbb,ccc

  4.  select value+’,’ from tb where ID=1 for xml path(”)  
    这么就足以得到 “aa,bb,”

  5.  select id,valuelist=stuff((select ‘,’+value from tb as b where
    b.ID=a.ID for xml path(”)),1,1,”)  
    //注意这几个Stuff函数的交替,因为select后跟的是’,’ 所以要把那几个‘,’
    替换掉
        from tb as a   
        group by id

 

 

SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby  正是来去掉逗号

 

留下评论

网站地图xml地图