zoukankan      html  css  js  c++  java
  • SQL Server 联表字段合并查询

    经常遇到统计报表中,子表记录合并为一个字段的情况。例如:省表中各省经济水平前五的城市统计。

    有如下两表:dbo.省 和 dbo.市 (好吧,你可能会吐槽为什么用中文表名,其实我是为了方便查找替换)

    这里暂时不考虑经济水平前五这种外部条件,期望将所有城市使用中文逗号拼接起来,如图:

    具体做法如下:

    --基于子表查询
    SELECT 
        P.Name AS '',
        STUFF((SELECT ''+Name FROM dbo.市 WHERE Parent=C.Parent FOR XML PATH('')),1,1,'') AS ''
    FROM dbo.市 C
        LEFT JOIN dbo.省 P ON C.Parent = P.Code
    GROUP BY C.Parent, P.Name
    ORDER BY C.Parent
    
    --基于父表查询
    SELECT
        P.Name AS '',
        XC.City AS ''
    FROM dbo.省 P
        LEFT JOIN(
            SELECT 
                STUFF((SELECT ''+Name FROM dbo.市 WHERE Parent=C.Parent FOR XML PATH('')),1,1,'') AS 'City', 
                Parent 
            FROM dbo.市 C GROUP BY C.Parent
        ) XC ON P.Code=XC.Parent
    ORDER BY P.Code

    这里有两种查询方式,基于子表会忽略没有下属城市的省记录,例如直辖市;而基于父表则会在子表集合列显示NULL值,两种情况分场景使用。

    语法解释:

    STUFF('STRING',1,1,'')

    根据MSDN帮助,可以了解到,这是一个字符串替换函数,将参数1的字符串,从参数2位置(数据库索引通常从1开始,而不是0)开始截取,截取长度为参数3,截取的部分替换为参数4。

    SELECT STATEMENT FOR XML PATH('')

    这里的 SELECT STATEMENT 是常规查询语句,结果为xml集合,因此可以包括二维数据表。
    但构建此查询的目的是为了拼接一维的数据,因此这里的查询语句通常只查询一个字段,并在字段前使用分隔符。示例中使用的分隔符为中文逗号。
    具体的FOR XML PATH语法可以参考MSDN

    转载请注明出自飞扬的尘埃的博客园

  • 相关阅读:
    php-浅谈php底层机制
    Apache-三种工作模式(prefork/ worker/Event)
    java入门了解01
    webserivce通过httppost方式调用
    sqlserver 打开 database diagrams 报错:error code 0x54b
    redhat7,redhat6 替换yum
    虚拟机网络配置的一点总结
    搭建sqlserver AlwaysOn
    NSSM-将服务变为window service
    JavaMelody-监控jvm性能
  • 原文地址:https://www.cnblogs.com/i0air/p/4607948.html
Copyright © 2011-2022 走看看