博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将一列包含多个ID拆分多行
阅读量:7052 次
发布时间:2019-06-28

本文共 1258 字,大约阅读时间需要 4 分钟。

原文:

看到个不常见的问题~然后在 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╰)╮

 

转载地址:http://xudol.baihongyu.com/

你可能感兴趣的文章
订单可视化(智能制造、流程再造、企业信息化) 第四篇 技术方案的制定
查看>>
EBS 11i 中的标准工作流列表
查看>>
架构设计:系统间通信(20)——MQ:消息协议(下)
查看>>
我的友情链接
查看>>
dubbo线程池优化
查看>>
如何将excel中的每一个sheet单存成一个excel文件
查看>>
Java中参数传递是值传递,还是引用传递
查看>>
老男孩教育每日一题-2017年5月12日-磁盘知识点:linux系统中LVM配置实现方法?
查看>>
Linux:压缩解压命令
查看>>
PHP并发IO编程之路
查看>>
让PHP7达到最高性能的几个Tips
查看>>
hibernate 继承映射(二)
查看>>
我的友情链接
查看>>
联想关键业务服务器 sysytem X3950 X6 4U机架式服务器
查看>>
day31:linux系统管理工具(一) w vmstat top sar nload
查看>>
系统集成资质培训 - 考前冲刺100题新书上市
查看>>
一键自动化部署(定制rpm包)
查看>>
web.py开发web 第七章 Formalchemy + Jinja2
查看>>
Python Replace
查看>>
expect自动化交互脚本(三)
查看>>