将一列包含多个ID拆分多行
来源:互联网 发布:软件测试bug管理工具 编辑:程序博客网 时间:2024/06/07 07:29
看到个不常见的问题~然后在 Inner Sql Server2008 里面找到一个思路。
如果下面的表结构,如何拆分多行并对应员工号呢?
首先创建测试表
CREATE TABLE Department( ID INT IDENTITY(1,1) PRIMARY KEY, DepartmentName VARCHAR(50) NULL, Members NVARCHAR(500) NULL)CREATE TABLE Employee( ID INT IDENTITY(1,1) PRIMARY KEY, NAME NVARCHAR(50) NULL)INSERT INTO Department VALUES('行政','1,3,5,10,12'),('销售','42,23,35,40,22'),('市场','13,17,27,28,43')SELECT * FROM dbo.Department
Employee 表的数据直接用个 Sql Generator生成一下下就好了~
--然后搞个数字辅助表作备用CREATE TABLE #Num (ID INT)INSERT INTO #Num ( ID )SELECT TOP 500 ROW_NUMBER() OVER (ORDER BY (SELECT 1)) FROM sys.objects a,sys.objects b
--为了方便看代码,用个CTE来写。
;WITH CTE1 AS(SELECT a.ID, a.DepartmentName, a.Members, b.ID AS Pos, CHARINDEX(',',a.Members,b.ID) AS NextSplit FROM dbo.Department a INNER JOIN #Num b ON SUBSTRING(',' + a.Members,b.ID,1) = ',' AND b.ID <= LEN(a.Members)),CTE2 AS(SELECT ID,DepartmentName, CASE WHEN NextSplit <> 0 THEN SUBSTRING(Members,Pos,NextSplit - Pos) ELSE RIGHT(Members,LEN(Members) - Pos + 1) END AS EmployeeID FROM CTE1)SELECT a.* ,b.NAME FROM CTE2 a INNER JOIN dbo.Employee b ON a.EmployeeID = b.ID
PS: 上述语句其实优化空间是很大的,这里只是提供给一个方法~就暂时不纠结效率上罗~╭(╯3╰)╮
0 0
- 将一列包含多个ID拆分多行
- 一列拆分为多列
- 一列拆分为多列
- oracle ebs 拆分一列为多行的问题
- sql--一列拆分为多列
- Acrobat如何将PDF拆分为多个文档
- android将path拆分为多个path
- WinForm_DataGridView一列多个按钮
- 一列保存多个ID(将多个用逗号隔开的ID转换成用逗号隔开的名称)【网上讨论】
- 一列保存多个ID(将多个用逗号、特殊符号 隔开的ID转换成用逗号隔开的名称)
- 将一列字符串显示为转换为多行显示
- MSSQL 将一列中的多行拼接为一行
- SQL/Oracle 将一列多行合并为一行
- 一列多行合并一列一行
- sql查询find_in_set,字段包含多个ID,并用逗号分开,查询该字段是否包含某个ID
- Oracle将一列分成多列
- SQL将一列多行数据合并
- 将一列值拆分成两列,并插入到新表中
- IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
- 关于openCV安装配置最为详尽的一篇文章
- 使用scrapy的定制爬虫-第三章-爬虫的javascript支持
- Sql Server 添加外部程序集基本操作
- Google Code Jam 2016 R1B
- 将一列包含多个ID拆分多行
- Filestream 使用简单步骤
- 关于Visual Studio 2013新建MVC项目,会一直请求地址
- 简析一下SQL Server里面Fast_Forword 和 SRROLL 的区别
- Sql Server 2008R2 遇到了BCP导入各种中文乱码的问题
- 行大小计算测试
- 一个update的小故事
- 【OGG】SqlServer同步源端增加trandata报错解决
- 小括号与花括号小括号与花括号