SQL Server含逗号分隔的数据匹配维表
日常有时候导出数据需求时,数据列会遇到带有分隔符的ID,但又需要匹配维表(如下图所示)将ID变成名称。
这种情况可以采用“分隔-匹配-合并”的方法

具体代码为:
-- 准备工作1:创建事实表数据
CREATE TABLE #StudentSubject
(
StuID INT IDENTITY(1,1) NOT NULL,
StuSubject VARCHAR(500) NOT NULL
)
INSERT INTO #StudentSubject(StuSubject) VALUES ('')
INSERT INTO #StudentSubject(StuSubject) VALUES ('')
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 ('') -- 准备工作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)) Split
FROM #StudentSubject
UNION ALL
SELECT StuID,
CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(100)) SIds,
CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(100)) Split
FROM CetSubject
WHERE split > ''
)
-- 2匹配 将分离后的数据逐行与维表匹配
SELECT CS.StuID,
DS.SubjectName
INTO #CetSubjectName
FROM CetSubject CS
LEFT 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,'') SubjectName
FROM #CetSubjectName t2
GROUP BY StuID DROP TABLE #D_Subject
DROP TABLE #StudentSubject
DROP TABLE #CetSubjectName
SQL Server含逗号分隔的数据匹配维表的更多相关文章
- sql server 中 like 中文不匹配问题解决就这么简单
原文:sql server 中 like 中文不匹配问题解决就这么简单 MS-SQL Server select * from Book where BookName like'%C语言%' 在SQ ...
- 恢复SQL Server被误删除的数据(再扩展)
恢复SQL Server被误删除的数据(再扩展) 大家对本人之前的文章<恢复SQL Server被误删除的数据> 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的 ...
- 恢复SQL Server被误删除的数据
恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...
- SQL SERVER 和ACCESS的数据导入导出
//批量导入Access string filepath = Server.MapPath("student.mdb"); stri ...
- .SQL Server中 image类型数据的比较
原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...
- [转]实战 SQL Server 2008 数据库误删除数据的恢复
实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...
- SQL Server 2008 数据库误删除数据的恢复
原文:SQL Server 2008 数据库误删除数据的恢复 原文:http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_ ...
- SQL Server 2008 批量插入数据时报错
前几天在SQL Server 2008同步产品数据时,总是提示二进制文本被截断的错误,但是经过检查发现数据都符合格式要求. 百思不得其解,单独插入一条条数据则可以插入,但是批量导入则报错. 批量导入代 ...
- C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]
C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Dat ...
随机推荐
- 【Android】用Cubism 2制作自己的Live2D——来制作动态壁纸吧!
前言- Andorid SDK下载 baidu云 提取码:19jm 这次我们就来研究一下官方的例子之一的liveWallPaper,也就是开发Android的动态壁纸 先来看看这个例子运行的结果: ...
- ionic3 生命周期
ionic3 总共有8个钩子函数,分别是:onPageLoaded,onPageWillEnter,onPageDidEnter,onPageWillLeave,onPageDidLeave,onPa ...
- 数据库常用操作SQL语句
禁用触发器: alter table tb disable trigger tir_name 启用触发器: alter table tb enable trigger tir_name
- pod command
pod 基础使用命令 创建Podfile文件 1 pod init 使用命令打开Podfile文件 1 open -a Xcode Podfile 搜索pod 库 1 pod search 库名 更新 ...
- 深入理解Java虚拟机-第1章-走进Java-读书笔记
第 1 章 走近 Java 前言 Java 的技术体系主要是由支撑 Java 程序运行的虚拟机.为各开发领域提供接口支持的 Java API.Java 编程语言及许许多多的第三方 Java 框架(如 ...
- Java相关面试题总结+答案(一)
[Java基础] 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,即Java开发工具包,提供了Java 的开发环境和运行环境. JRE:Java Ru ...
- java常用API的总结(1)
本篇是对于这一段时间以来接触到的常用api的一些总结,便于以后的查阅.... 一.正则表达式 对于正则表达式,我的感觉就是当我们在做某些题的时候正则表达式会省去我们很多的时间,并且正则表达式的使用格式 ...
- 《前端之路》之二:数据类型转换 && 隐式转换 || 显式转换
目录 02:数据类型转换 && 隐式转换 || 显式转换 02:数据类型转换 && 隐式转换 || 显式转换 在上一个章节中,我们介绍了 JavaScript 的基本的 ...
- Docker系列之基础实践篇(上)
常用命令回顾 帮助命令 1.启动docker //启动 $ systemctl start docker 2.查看docker版本 $ docker version 3.查看安装的docker信息描述 ...
- h2engine游戏服务器设计之聊天室示例
游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...