一列保存多个ID(将多个用逗号隔的ID转换成用逗号隔开的名称).docxVIP

一列保存多个ID(将多个用逗号隔的ID转换成用逗号隔开的名称).docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在做项目时,经常会遇到这样的表结构在主表的中有一列保存的是用逗号隔开ID 背景:在做项目时,经常会遇到这样的表结构在主表的中有一列保存的是用逗号隔开ID。如,当一个员工从属多个部门时、当一个项目从属多个城市时、当一个设 备从属多个项目时,很多人都会在员工表中加入一个deptIds VARCHAR(1000)列(本文以员工从属多个部门为例),用以保存部门编号列表(很明显这不符合第一范式,但很多人这样设计了,在这篇文章中我们暂 不讨论在这种应用场景下,如此设计的对与错,有兴趣的可以在回复中聊聊),然后我们在查询列表中需要看到这个员工从属哪些部门。 初始化数据: 部门表、员工表数据: 复制代码 代码如下: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N[dbo].[Department])) DROP TABLE [dbo].Department GO --部门表 CREATE TABLE Department ( id int, name nvarchar(50) ) INSERT INTO Department(id,name) SELECT 1,人事部 UNION SELECT 2,工程部 UNION SELECT 3,管理部 SELECT * FROM Department IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N[dbo].[Employee])) DROP TABLE [dbo].Employee GO --员工表 CREATE TABLE Employee ( id int, name nvarchar(20), deptIds varchar(1000) ) INSERT INTO Employee(id,name,deptIds) SELECT 1,蒋大华,1,2,3 UNION SELECT 2,小明,1 UNION SELECT 3,小华, SELECT * FROM Employee 希望得到的结果: 解决方法: 第一步,是得到如下的数据。即将员工表集合与相关的部门集合做交叉连接,其中使用了fun_SplitIds函数(作用是将ids分割成id列表),然后员工集合与这个得到的集合做交叉连接 复制代码 代码如下: SELECT E.*,ISNULL(D.name,) AS deptName FROM Employee AS E OUTER APPLY dbo.fun_SplitIds(E.deptIds) AS DID LEFT JOIN Department AS D ON DID.ID=D.id; 第 二步,已经得到了如上的数据,然后要做的就是根据ID分组,并对deptName列做聚合操作,但可惜的是SQL SERVER还没有提供对字符串做聚合的操作。但想到,我们处理树形结构数据时,用CTE来做关系数据,做成有树形格式的数据,如此我们也可以将这个问题 转换成做树形格式的问题,代码如下: 复制代码 代码如下: ;WITH EmployeT AS( --员工的基本信息(使用OUTER APPLY将多个ID拆分开来,然后与部门表相关联) --此时已将员工表所存的IDS分别与部门相关联,下面需要将此集合中的deptName聚合成一个记录 SELECT E.*,ISNULL(D.name,) AS deptName FROM Employee AS E OUTER APPLY dbo.fun_SplitIds(E.deptIds) AS DID LEFT JOIN Department AS D ON DID.ID=D.id ),mike AS( SELECT id,name,deptIds,deptName ,ROW_NUMBER()OVER(PARTITION BY id ORDER BY id) AS level_num FROM EmployeT ),mike2 AS( SELECT id,name,deptIds,CAST(deptName AS NVARCHAR(100)) AS deptName,level_num FROM mike WHERE level_num=1 UNION ALL SELECT m.id,,m.deptIds,CAST(m2.deptName+,+m.deptName AS NVARCHAR(100)) AS deptName,m.level_num FROM mike A

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档