日常有时候导出数据需求时,数据列会遇到带有分隔符的ID,但又需要匹配维表(如下图所示)将ID变成名称。

这种情况可以采用“分隔-匹配-合并”的方法

具体代码为:

  1. -- 准备工作1:创建事实表数据
  2. CREATE TABLE #StudentSubject
  3. (
  4. StuID INT IDENTITY(1,1) NOT NULL,
  5. StuSubject VARCHAR(500) NOT NULL
  6. )
  7. INSERT INTO #StudentSubject(StuSubject) VALUES ('')
  8. INSERT INTO #StudentSubject(StuSubject) VALUES ('')
  9. INSERT INTO #StudentSubject(StuSubject) VALUES ('2,3')
  10. INSERT INTO #StudentSubject(StuSubject) VALUES ('2,3,4')
  11. INSERT INTO #StudentSubject(StuSubject) VALUES ('1,2,3,4')
  12. INSERT INTO #StudentSubject(StuSubject) VALUES ('')
  13.  
  14. -- 准备工作2:创建维表数据
  15. CREATE TABLE #D_Subject
  16. (
  17. SubjectID INT IDENTITY(1,1) NOT NULL,
  18. SubjectName VARCHAR(500) NOT NULL
  19. )
  20.  
  21. INSERT INTO #D_Subject(SubjectName) VALUES ('语文')
  22. INSERT INTO #D_Subject(SubjectName) VALUES ('数学')
  23. INSERT INTO #D_Subject(SubjectName) VALUES ('英语')
  24. INSERT INTO #D_Subject(SubjectName) VALUES ('体育')
  25.  
  26. SELECT * FROM #StudentSubject
  27. SELECT * FROM #D_Subject
  28. ;
  29.  
  30. -- 1分离:将逗号分隔的StuSubject分离匹配StudentSubject获取标签
  31. WITH CetSubject AS
  32. (
  33. SELECT StuID,
  34. CAST(LEFT(StuSubject, CHARINDEX(',', StuSubject + ',') - 1) AS NVARCHAR(100)) SubjectID,
  35. CAST(STUFF(StuSubject + ',', 1, CHARINDEX(',', StuSubject + ','), '') AS NVARCHAR(100)) Split
  36. FROM #StudentSubject
  37. UNION ALL
  38. SELECT StuID,
  39. CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(100)) SIds,
  40. CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(100)) Split
  41. FROM CetSubject
  42. WHERE split > ''
  43. )
  44. -- 2匹配 将分离后的数据逐行与维表匹配
  45. SELECT CS.StuID,
  46. DS.SubjectName
  47. INTO #CetSubjectName
  48. FROM CetSubject CS
  49. LEFT JOIN #D_Subject DS ON DS.SubjectID = CS.SubjectID
  50. WHERE CS.SubjectID <> ''
  51. OPTION (MAXRECURSION 0);
  52.  
  53. -- 3合并 将与维表匹配的结果用逗号分隔合并还原
  54. SELECT StuID,
  55. STUFF((SELECT ',' + T.SubjectName FROM #CetSubjectName T WHERE T.StuID = T2.StuID FOR XML PATH('')),1,1,'') SubjectName
  56. FROM #CetSubjectName t2
  57. GROUP BY StuID
  58.  
  59. DROP TABLE #D_Subject
  60. DROP TABLE #StudentSubject
  61. DROP TABLE #CetSubjectName

SQL Server含逗号分隔的数据匹配维表的更多相关文章

  1. sql server 中 like 中文不匹配问题解决就这么简单

    原文:sql server 中 like 中文不匹配问题解决就这么简单 MS-SQL Server select * from Book where BookName like'%C语言%'  在SQ ...

  2. 恢复SQL Server被误删除的数据(再扩展)

    恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...

  3. 恢复SQL Server被误删除的数据

    恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...

  4. SQL SERVER 和ACCESS的数据导入导出

            //批量导入Access         string filepath = Server.MapPath("student.mdb");         stri ...

  5. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  6. [转]实战 SQL Server 2008 数据库误删除数据的恢复

    实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...

  7. SQL Server 2008 数据库误删除数据的恢复

    原文:SQL Server 2008 数据库误删除数据的恢复 原文:http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_ ...

  8. SQL Server 2008 批量插入数据时报错

    前几天在SQL Server 2008同步产品数据时,总是提示二进制文本被截断的错误,但是经过检查发现数据都符合格式要求. 百思不得其解,单独插入一条条数据则可以插入,但是批量导入则报错. 批量导入代 ...

  9. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

    C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...

随机推荐

  1. Java虚拟机一:运行时数据区域

    java虚拟机在执行java程序的过程中,会把内存划分为若干个不同的数据区域.每个区域都有各自的用途,创建和销毁时间,按照<java虚拟机规范(Java SE 7 版)>的规定,虚拟机运行 ...

  2. SQL Server内幕之数据页

    数据页是包含已添加到数据库表中的用户数据的结构. 如前所述, 数据页有三种, 每个都以不同的格式存储数据. SQL server 有行内数据页.行溢出数据页和 LOB 数据页. 与 SQL serve ...

  3. MongoDB通过Shell 实现集合的日常归档

    1.MongoDB数据归档的意义 和其他类型的数据库一样,归档对MongoDB同样重要.通过归档,可以保持集合中合适的数据量,对数据库的性能是一种保障,也就是大家常说的数据冷热分离. 同时,归档对数据 ...

  4. Linux新加磁盘挂载和重启自动挂载

    提示两点:*新加的硬盘需要重启服务器fdisk -l才能看到*下面操作要用root账户大概是这样的,查看-分区-格式化-挂载-重启自动挂载1.加硬盘后重启服务器查看[root@test199 ~]# ...

  5. Followme Devops实践之路

    引言 天下武功,唯快不破 想要提高开发团队效率,势必要有一套完整而成熟的开发流程方案,除了sprint迭代开发模式之外,还有近几年流行的devops流程,都是可以大幅度提高开发效率的工具. 我们团队也 ...

  6. Android 开发者必知必会的权限管理知识

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ 导语 本 ...

  7. Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!

    目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...

  8. 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上)

    为了介绍使用ASP.NET Core构建GraphQL服务器,本文需要介绍一下GraphQL,其实看官网的文档就行. 什么是GraphQL? GraphQL 既是一种用于 API 的查询语言也是一个满 ...

  9. Java读取Excel的另一种方法

    除了用poi读取Excel的表格外,还可用ExcelHelper读取Excel.代码一例 String[] fieldNames = new String[] { "studentId&qu ...

  10. 如何在ASP.NET Core中使用JSON Patch

    原文: JSON Patch With ASP.NET Core 作者:.NET Core Tutorials 译文:如何在ASP.NET Core中使用JSON Patch 地址:https://w ...