zoukankan      html  css  js  c++  java
  • Sql Server合并多行询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数

    示例表 tb 数据如下

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

    SELECT id,
           [val] = (
               SELECT [value] + ','
               FROM   tb AS b
               WHERE  b.id = a.id FOR XML PATH('')
           )
    FROM   tb AS a

    显示结果 
    1 aa,bb, 
    1 aa,bb, 
    2 aaa,bbb,ccc, 
    2 aaa,bbb,ccc, 
    2 aaa,bbb,ccc, 

    -----------------------------

    SELECT id,    
           [val]=( SELECT [value] +','    
                   FROM tb AS b    
                   WHERE b.id = a.id    
                   FOR XML PATH('')  )    
    FROM tb AS a     
    GROUP BY id

    显示结果 
    1 aa,bb, 
    2 aaa,bbb,ccc, 

    SELECT id,    
           [val]=STUFF( (SELECT ','+[value]    
                         FROM tb AS b    
                         WHERE b.id = a.id    
                         FOR XML PATH('')) , 1 , 1 , '' )   
    FROM tb AS a     
    GROUP BY id

    显示结果 
    1 aa,bb 
    2 aaa,bbb,ccc

    STUFF 函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符;然后将第二个字符串插入第一个字符串的开始位置。
    STUFF ( character_expression , start , length ,character_expression_insert )

    SELECT id,    
           [val]= REPLACE( (SELECT [value] AS [data()]   
                            FROM tb AS b    
                            WHERE b.id = a.id    
                            FOR XML PATH('')) , ' ', ',')   
    FROM tb AS a     
    GROUP BY id

    结果与上面一样。

    解析:[data()] 这里据说是起到一个类似数组的作用,具体用法还要再查。

    如果外围不用REPLACE函数包住,则返回的结果是 aaa bbb ccc ,每项之间有空格,所以最后用REPLACE函数将所有空格替换成逗号。

  • 相关阅读:
    SpringApplication类-1
    post与head注入
    sql_post注入
    渗透测试点线面合集
    渗透入侵溯源
    VMware 安装Tools 失败的问题:VGAuthService 启动失败
    Weblogic wls-wsat XMLDecoder 反序列化漏洞复现(CVE-2017-10271)
    web常见的中间件漏洞及复现
    XX点评H5字体映射
    python控制阿里云服务器开机,关机,重启
  • 原文地址:https://www.cnblogs.com/xiaotao726/p/6694645.html
Copyright © 2011-2022 走看看