有时为避免循环操作数据库、列表展示等一些原因需要将数据及关联数据批量加载进行集中处理,一种解决办法可以使用FOR XML PATH将多行数据合并成一列,达到字段拼接的效果。例如有两个表,

  部门表T_Dept:

  

  员工表T_Emp:

  

  需要查询每个部门下的员工姓名,查询语句:

 1 SELECT ROW_NUMBER() OVER (ORDER BY DeptId) AS Row, DeptName
2 , LEFT(A.EmpName, LEN(A.EmpName) - 1) AS EmpName
3 FROM (
4 SELECT DeptId, EmpName = (
5 SELECT EmpName + ','
6 FROM T_Emp emp2
7 WHERE emp2.DeptId = emp1.DeptId
8 FOR XML PATH('')
9 )
10 FROM T_Emp emp1
11 GROUP BY emp1.DeptId
12 ) A
13 LEFT JOIN T_Dept dept ON dept.Id = A.DeptId

  结果集:

  也可以这样写:

 1 SELECT ROW_NUMBER() OVER (ORDER BY Id) AS Row, DeptName
2 , LEFT(A.EmpName, LEN(A.EmpName) - 1) AS EmpName
3 FROM (
4 SELECT Id, DeptName, EmpName = (
5 SELECT EmpName + ','
6 FROM T_Emp emp1
7 WHERE emp1.DeptId = dept.Id
8 FOR XML PATH('')
9 )
10 FROM T_Dept dept
11 ) A

  结果集:

  

  SQL脚本:

 1 CREATE TABLE [dbo].[T_Dept](
2
3 [Id] [int] IDENTITY(1,1) NOT NULL,
4
5 [DeptName] [nvarchar](10) NULL,
6
7 CONSTRAINT [PK_T_Dept] PRIMARY KEY CLUSTERED
8
9 (
10
11 [Id] ASC
12
13 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
14
15 ) ON [PRIMARY]
16
17 GO
18
19
20
21 CREATE TABLE [dbo].[T_Emp](
22
23 [Id] [int] IDENTITY(1,1) NOT NULL,
24
25 [DeptId] [int] NULL,
26
27 [EmpName] [nvarchar](10) NULL,
28
29 CONSTRAINT [PK_T_Emp_1] PRIMARY KEY CLUSTERED
30
31 (
32
33 [Id] ASC
34
35 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
36
37 ) ON [PRIMARY]
38
39 GO
40
41
42
43 ALTER TABLE [dbo].[T_Emp] WITH CHECK ADD CONSTRAINT [FK_T_Emp_T_Dept] FOREIGN KEY([DeptId])
44
45 REFERENCES [dbo].[T_Dept] ([Id])
46
47 GO
48
49
50
51 ALTER TABLE [dbo].[T_Emp] CHECK CONSTRAINT [FK_T_Emp_T_Dept]
52
53 GO
54
55
56
57 INSERT INTO [dbo].[T_Dept]
58 SELECT '销售部'
59 UNION ALL
60 SELECT '研发部'
61 UNION ALL
62 SELECT '人力资源部'
63 UNION ALL
64 SELECT '行政部'
65 UNION ALL
66 SELECT '财务部'
67
68
69
70 INSERT INTO [dbo].[T_Emp]
71 SELECT '1', 'Tom'
72 UNION ALL
73 SELECT '1', 'John'
74 UNION ALL
75 SELECT '2', 'Blue'
76 UNION ALL
77 SELECT '2', 'Banks'
78 UNION ALL
79 SELECT '3', 'Niki'
80 UNION ALL
81 SELECT '3', 'Yuki'
82 UNION ALL
83 SELECT '5', '小明'

使用FOR XML PATH实现多行数据合并成一列的更多相关文章

  1. Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform

    Expression构建DataTable to Entity 映射委托   1 namespace Echofool.Utility.Common { 2 using System; 3 using ...

  2. SQL SERVER 如何把1列多行数据 合并成一列显示

    示例 修改前:1列多行数据 修改后:合并成一列 示例语句 1 2 3 4 5 6 7 8 9 10 11 select 类别,     名称 = (         stuff(            ...

  3. sql server 多行数据合并成一列

    首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...

  4. Kettle 行列互换之——行转列(多列数据合并成一列变为多行)

    原始需求如下: 业务系统设置成这样,见截图. 工资项目为了方便录入,都是做成列的. 但是这些数据需要和另外的费用报销系统的数据关联,费用报销系统的费用项目是横向的,用费用项目.金额的多行来表达.那么这 ...

  5. SQL将多行数据合并成一行【转】

    转:https://blog.csdn.net/AntherFantacy/article/details/83824182 今天同事问了一个需求,就是将多行数据合并成一行进行显示,查询了一些资料,照 ...

  6. 个人永久性免费-Excel催化剂功能第100波-透视多行数据为多列数据结构

    在数据处理过程中,大量的非预期格式结构需要作转换,有大家熟知的多维转一维(准确来说应该是交叉表结构的数据转二维表标准数据表结构),也同样有一些需要透视操作的数据源,此篇同样提供更便捷的方法实现此类数据 ...

  7. 使用Notepad++将多行数据合并成一行

    1.按Ctrl+F,弹出“替换”的窗口: 2.选择“替换”菜单: 3.“查找目标”内容输入为:\r\n: 4.“替换为”内容为空: 5.“查找模式”选择为正则表达式: 6.设置好之后,点击“全部替换” ...

  8. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  9. SQL 将一列多行数据合并为一行 FOR XML PATH

    FOR XML PATH 方法是用于将查询结果集以XML形式展示,这样展示方式的好处不言而喻.现在我要介绍的FOR XML PATH的"另类"用法. 首先,我们先来看看它的正常用法 ...

随机推荐

  1. Redis缓存篇(二)淘汰机制:缓存满了怎么办?

    上一讲提到,缓存的容量总是小于后端数据库的.随着业务系统的使用,缓存数据会撑满内存空间,该怎么处理呢? 本节我们来学习内存淘汰机制.在Redis 4.0之前有6种内存淘汰策略,之后又增加2种,一共8种 ...

  2. vue中添加文字或图片水印

    首先引用warterMark.js,内容如下 'use strict' var watermark = (className,str,type) => { let dom = document. ...

  3. 当音乐学博士搞起编程,用一本书改变了Java世界!

    前言 说到Spring,也许现在的开发者们最先想到的是 Josh Long 超快的语速与现场代码能力,让很多Java开发者折服. 然后Spring的历史上,最传奇的还是要数其创始人:Rod Johns ...

  4. 剑指offer 面试题9:用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移 ...

  5. 如何在 Vite 中使用 Element UI + Vue 3

    在上篇文章<2021新年 Vue3.0 + Element UI 尝鲜小记>里,我们尝试使用了 Vue CLI 创建 Vue 3 + Element UI 的项目,而 Vue CLI 实际 ...

  6. 剑指Offer58-左转字符串

    题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=" ...

  7. 关于软件架构中的b/s

    **B/S架构 b/s只需要一个浏览器,用户就可以通过不同的网址访问不同的服务器程序. 优点:开发,安装,部署,维护简单 缺点:对硬件要求过高,用户的体验会受到影响 首先是资源分类:**可以分为静态资 ...

  8. 常用的N个网站建议收藏

    类型网站路径学习资源及博客论坛网站 书栈网:https://www.bookstack.cn 52 download: http://www.52download.cn/wpcourse/ 菜鸟教程: ...

  9. upload-labs 1-21关通关记录

    0x01: 检查源代码,发现JS前端验证,关闭JS即可连接,或者手动添加.php,或者上传1.jpg,再抓包修改为php 0X02: if (($_FILES['upload_file']['type ...

  10. 【Linux】md5sum 生产所有文件的md5值,并对照目标文件是否相同

    现在加入有很多很多文件需要测试md5,想看下是否都传输成功了,如何批量生成文件的md5并且逐条对照呢? 下面来简单介绍下 md5sum这个命令有一个选项"-c" 这个选项的意思是c ...