SQL Server 联表字段合并查询
2015-06-29 17:13
162 查看
经常遇到统计报表中,子表记录合并为一个字段的情况。例如:省表中各省经济水平前五的城市统计。
有如下两表:dbo.省 和 dbo.市 (好吧,你可能会吐槽为什么用中文表名,其实我是为了方便查找替换)
这里暂时不考虑经济水平前五这种外部条件,期望将所有城市使用中文逗号拼接起来,如图:
具体做法如下:
这里有两种查询方式,基于子表会忽略没有下属城市的省记录,例如直辖市;而基于父表则会在子表集合列显示NULL值,两种情况分场景使用。
语法解释:
根据MSDN帮助,可以了解到,这是一个字符串替换函数,将参数1的字符串,从参数2位置(数据库索引通常从1开始,而不是0)开始截取,截取长度为参数3,截取的部分替换为参数4。
这里的 SELECT STATEMENT 是常规查询语句,结果为xml集合,因此可以包括二维数据表。
但构建此查询的目的是为了拼接一维的数据,因此这里的查询语句通常只查询一个字段,并在字段前使用分隔符。示例中使用的分隔符为中文逗号。
具体的FOR XML PATH语法可以参考MSDN。
转载请注明出自飞扬的尘埃的博客园。
有如下两表: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。
转载请注明出自飞扬的尘埃的博客园。
相关文章推荐
- MySQL模拟:线上误update的恢复
- sqlserver 语句中的default 是怎么用的?
- iOS 开发之数据库(SQLite)
- MySQL存储引擎
- 使用log miner 分析oracle日志 推荐
- 规则引擎连接数据库
- MySQL插入语句insert性能优化
- MySQL grant 语法的详细解析
- 在MYSQL中插入当前时间,就象SQLSERVER的GETDATE()一样
- Spring Mongodb
- MySQL事务的艺术和陷阱
- SQL,NoSQL 以及数据库的实质
- 对mongodb的shard机制的一点测试
- talend hive数据导入到mysql中
- MySQL表空间的碎片整理
- SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则
- sql语句按照汉字拼音首字母排序
- Oracle 序列 每天 重建
- MongoDB学习笔记--基本操作
- MySQL学习系列12: 权限管理