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

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

具体代码为:

-- 准备工作1:创建事实表数据
CREATE TABLE #StudentSubject
(
StuID INT IDENTITY(1,1) NOT NULL,
StuSubject VARCHAR(500) NOT NULL
)
INSERT INTO #StudentSubject(StuSubject) VALUES ('1')
INSERT INTO #StudentSubject(StuSubject) VALUES ('2')
INSERT INTO #StudentSubject(StuSubject) VALUES ('2,3')
INSERT INTO #StudentSubject(StuSubject) VALUES ('2,3,4')
INSERT INTO #StudentSubject(StuSubject) VALUES ('1,2,3,4')
INSERT INTO #StudentSubject(StuSubject) VALUES ('4')-- 准备工作2:创建维表数据
CREATE TABLE #D_Subject
(
SubjectID INT IDENTITY(1,1) NOT NULL,
SubjectName VARCHAR(500) NOT NULL
)INSERT INTO #D_Subject(SubjectName) VALUES ('语文')
INSERT INTO #D_Subject(SubjectName) VALUES ('数学')
INSERT INTO #D_Subject(SubjectName) VALUES ('英语')
INSERT INTO #D_Subject(SubjectName) VALUES ('体育')SELECT * FROM #StudentSubject
SELECT * FROM #D_Subject
;-- 1分离:将逗号分隔的StuSubject分离匹配StudentSubject获取标签
WITH CetSubject AS
(
SELECT StuID,CAST(LEFT(StuSubject, CHARINDEX(',', StuSubject + ',') - 1) AS NVARCHAR(100)) SubjectID,CAST(STUFF(StuSubject + ',', 1, CHARINDEX(',', StuSubject + ','), '') AS NVARCHAR(100)) SplitFROM #StudentSubjectUNION ALL
SELECT StuID,CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(100)) SIds,CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(100)) SplitFROM CetSubjectWHERE split > ''
)
-- 2匹配 将分离后的数据逐行与维表匹配
SELECT CS.StuID,DS.SubjectNameINTO #CetSubjectNameFROM CetSubject CSLEFT JOIN #D_Subject DS ON DS.SubjectID = CS.SubjectID WHERE CS.SubjectID <> ''
OPTION (MAXRECURSION 0);-- 3合并 将与维表匹配的结果用逗号分隔合并还原
SELECT StuID,STUFF((SELECT ',' + T.SubjectName FROM #CetSubjectName T WHERE T.StuID = T2.StuID FOR XML PATH('')),1,1,'') SubjectNameFROM #CetSubjectName t2GROUP BY StuIDDROP TABLE #D_Subject
DROP TABLE #StudentSubject
DROP TABLE #CetSubjectName

转载于:https://www.cnblogs.com/kylan/p/10541653.html

SQL Server含逗号分隔的数据匹配维表相关推荐

  1. sql server 2008 导入导出数据大全

    /*******  导出到excel EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q - S&quo ...

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

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

  3. 转载-SQL Server各种导入导出数据方式的比较

    注:本文转载自 http://blog.csdn.net/nokiaguy/article/details/4684822 当我们建立一个数据库时,并且想将分散在各处的不同类型的数据库分类汇总在这个新 ...

  4. [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE

    需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...

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

    原文:恢复SQL Server被误删除的数据(再扩展) 恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是 ...

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

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

  7. sql server left join 重复数据原因图

    sql server left join 重复数据原因图     网购从这里开始 ( 物美价廉还等什么?!!! )

  8. SQL Server 2000安装指南及数据创建

    SQL Server 是一个关系数据库管理系统,它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本.在Windows NT ...

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

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

最新文章

  1. LeetCode 217 Contains Duplicate--python,java解法--set--简单
  2. python 网络通讯 plc_PLC与PC网络通信实验
  3. Spring Boot - 自动配置实例解读
  4. SpringBoot 包含处理
  5. Linux统计文件行数、字数、字节数
  6. 飞鸽传书2012绿色版下载
  7. RHEL5下构建Snort网络***检测系统
  8. 【转】Delphi实现自动发贴和识别验证码 王泽宾
  9. C 字符串转换为c语言字符串,OC字符串与C语言字符串之间的相互转换
  10. linq判断集合中相同元素个数_高中数学:集合与函数概念知识点汇总
  11. ESP8285与ESP8266的差异
  12. 阿里Maven仓库不限容量,免费用
  13. tp php websocket教程,tp6 websocket方法详解
  14. 聊一聊,android程序员前景如何
  15. 淘宝运营 淘宝客的模式 、优点以及推广方案
  16. C语言中关于二进制的换算
  17. 生命苍白无力时候遇到你,即使再难也要亲手绘出五彩生活――读《平庸的世界》有感...
  18. Typescript系列(一):TS入门教程之简介、安装、编译、监听
  19. 正则校验必须由数字 字母 和 特殊符号组成的正则
  20. 写一个函数找出一个整数数组中,第二大的数

热门文章

  1. python装饰器由浅入深_详解Python装饰器由浅入深
  2. NOI数学之提高级:欧拉定理和欧拉函数
  3. RTX5 | 事件标志组01 - 创建事件标志组
  4. 浏览器填写数据,跳转页面返回数据不消失
  5. layui结合form,table的全选、反选v1.0
  6. 阿里云 mysql 双主_mysql数据库一主两从
  7. Qt文档阅读笔记-void QObject::deleteLater()解析
  8. Linux笔记-使用crontab定时调用sh文件
  9. asc码转换 linux_Linux终端下将图片转换ASCII Art代码图案
  10. java设置等待锁的时间_java的锁池和等待池