`
csstome
  • 浏览: 1521165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

拆解组装SQL字符串全过程

阅读更多

先看下面这段代码, 它将sql字符串先分割为行集,做一定处理后再合并为单行:

use tempdb
go

if (object_id ('t_Item' ) is not null ) drop table t_item
go
if (object_id ('t_Buy' ) is not null ) drop table t_Buy
go
create table t_Item (Item_ID int , Item_Name varchar (10 ))
insert into t_Item select 1 , '面包' union select 2 , '衣服' union select 3 , '鞋子'
create table t_Buy (Person varchar (10 ), WantBuy varchar (10 ))
insert into t_Buy select '小张' , '1,2' union select '小王' , '1,2,3'

go
/*原始表数据
Person WantBuy
---------- ----------
小张 1,2
小王 1,2,3
*/

/*要求查询结果
Person WantBuy
---------- -----------------
小王 面包,衣服,鞋子
小张 面包,衣服
*/

select Person , WantBuy = cast (replace (WantBuy , '</v><v>' , ',' ) as xml ). value ('.' , 'varchar(max)' )
from (select distinct Person from t_Buy ) ta outer apply (
select WantBuy = (select WantBuy as v from
(
select Person , c . Item_Name as WantBuy from (
select Person , convert (xml , '<v>' + replace (WantBuy , ',' , '</v><v>' )+ '</v>' ) as WantBuy
from t_Buy )a outer apply
(
select t . c . value ('.' , 'varchar(max)' ) AS WantBuy from a . WantBuy . nodes ('//v' ) AS t (c )
)b inner join t_Item c on b. wantbuy = c . item_id
)d where person = ta . person for xml path ('' ))
)tb

如果这段代码对于你来说是小case 那你就可以忽略此文,去论坛灌水去了。如果你还不了解他的工作原理,请继续耐心看完下面的分解过程。你需要单独理解以下内容:

SQL CTE(Common Table Expressions:公共表达式)

http://msdn.microsoft.com/zh-cn/library/ms190766.aspx

apply 关键字的用法

http://msdn.microsoft.com/zh-cn/library/ms175156.aspx

XQuery查询

http://blog.csdn.net/jinjazz/archive/2009/08/13/4443585.aspx

For XML子句

http://msdn.microsoft.com/zh-cn/library/ms190922.aspx

下面把上述语句分解为五个步骤,最后一个步骤就是最后需要的结果。

use tempdb
go

if (object_id ('t_Item' ) is not null ) drop table t_item
go
if (object_id ('t_Buy' ) is not null ) drop table t_Buy
go
create table t_Item (Item_ID int , Item_Name varchar (10 ))
insert into t_Item select 1 , '面包' union select 2 , '衣服' union select 3 , '鞋子'
create table t_Buy (Person varchar (10 ), WantBuy varchar (10 ))
insert into t_Buy select '小张' , '1,2' union select '小王' , '1,2,3'

go

/*第一步把WantBuy转为xml
Person WantBuy
---------- ----------------------------
小张 <v>1</v><v>2</v>
小王 <v>1</v><v>2</v><v>3</v>
*/

;with t1 as
(
select Person , convert (xml , '<v>' + replace (a . WantBuy , ',' , '</v><v>' )+ '</v>' ) as WantBuy
from t_Buy a
)


/*第二步把WantBuy字段拆分为多行
Person WantBuy
---------- --------
小张 1
小张 2
小王 1
小王 2
小王 3
*/
, t2 as
(
select a . Person , b. WantBuy from t1 a outer apply
(
select t . c . value ('.' , 'varchar(max)' ) AS WantBuy from a . WantBuy . nodes ('//v' ) AS t (c )
)b
)
/*第三步把WantBuy字段转为物品的名称
person item_name
---------- ----------
小张 面包
小张 衣服
小王 面包
小王 衣服
小王 鞋子
*/
, t3 as
(
select a . person , b. item_name from t2 a inner join t_Item b on a . wantbuy = b. item_id
)
/*第四步把WantBuy字段按照人名来聚合
Person WantBuy
---------- ------------------------------------
小王 <v>面包</v><v>衣服</v><v>鞋子</v>
小张 <v>面包</v><v>衣服</v>
*/
, t4 as
(
select * from (select distinct Person from t_Buy )a outer apply
(
select WantBuy = (select Item_Name as v from t3 where person = a . person for xml path ('' ))
)b
)

/*第五步把XML字段转为逗号分割的普通字段
Person WantBuy
---------- -----------------
小王 面包,衣服,鞋子
小张 面包,衣服
*/
, t5 as
(
select Person , WantBuy = cast (replace (WantBuy , '</v><v>' , ',' ) as xml ). value ('.' , 'varchar(max)' ) from t4
)
select * from t5

我们这里不得不夸奖一下SQLServer2005的CTE表达式,它可以把很复杂的嵌套查询分解为简单的多步查询。

分享到:
评论

相关推荐

    Labview 搜索拆分字符串

    Labview编写的代码, 搜索拆分字符串

    sqlserver实现字符拆解成表格的形式

    ### SQL Server 实现字符拆解成表格的形式 在SQL Server中,经常需要处理字符串操作,例如将一个包含多个值的字符串拆分成多个行。这种需求常见于数据导入、数据清洗等场景。本篇文章将详细介绍如何利用SQL Server...

    四则运算解析器(字符串)

    四则运算解析器是一种计算机程序,它能够接收包含加、减、乘、除等四则运算符的字符串表达式,并将其转化为可执行的计算过程。这个解析器通常用于解决基础的数学问题,对于编程初学者来说,理解并实现这样一个解析器...

    hive sql 拆解字段.docx

    Hive SQL 拆解字段详解 Hive SQL 中的拆解字段是指将一个字段拆分成多个子字段,以便更好地分析和处理数据。在 Hive 中,可以使用多种函数来拆解字段,本文将详细介绍四种常用的函数:SPLIT、SUBSTRING_INDEX、...

    蓝桥杯培训教程+逻辑推理+排序+ 图形(矩阵)+ 数字变幻+ 数字组合与拆解+字符串+ 数制转换+排列组合等

    蓝桥杯培训教程 一、 逻辑推理 二、排序 三、 图形(矩阵) 四、 数字变幻 五、 数字组合与拆解 六、 字符串 七、 数制转换 八、 排列组合 九、 其它 十、 数据结构

    教育科研-学习工具-一种3D零件拆解组装平台.zip

    《3D零件拆解组装平台:教育科研与学习的新维度》 在当今的教育科研领域,创新的教学工具正逐渐成为提升学习效率和实践能力的关键。本文将深入探讨一种名为“3D零件拆解组装平台”的学习工具,它以其独特的优势为...

    行业文档-设计装置-一种3D零件拆解组装平台.zip

    3. **组装模拟**:用户可以模拟不同零件的组装过程,检查配合是否紧密,运动是否顺畅,以及是否存在干涉等问题。 4. **动画演示**:平台可能还支持生成装配和拆卸的动态演示,方便向其他团队成员或客户展示设计概念...

    华为OD机试C卷- 最长子字符串的长度(一).md-私信看全套OD代码及解析

    任务是在这个环形字符串中找到一个子字符串,要求该子字符串中字符`o`出现的次数为偶数,并且该子字符串尽可能长。最终输出这个最长子字符串的长度。 **输入描述**: - 输入是一个小写字母组成的字符串`s`。 - 字符...

    js处理json以及字符串的比较等常用操作

    标题:“js处理json以及字符串的比较等常用操作” 知识点: 1. JSON的处理:在JavaScript中,JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。其易于人阅读和编写,同时也易于机器解析和生成。在...

    演示如何使用 split() 函数将一个包含多个单词的字符串分割成单词列表

    总的来说,`split()`函数是Python中处理字符串的基石之一,通过理解和熟练运用它,开发者可以轻松地对字符串进行拆解,从而更好地进行数据处理和分析。无论是简单的文本分割还是复杂的字符串操作,`split()`都能提供...

    vb中逆序输出

    在VB(Visual Basic)编程语言中,逆序输出是一个常见的编程练习,旨在帮助学习者理解字符串操作、变量处理以及流程控制的基本概念。本篇将深入探讨如何在VB中实现逆序输出,包括代码分析、原理讲解及实际应用,旨在...

    爱普生R270拆解全过程

    【爱普生R270打印机拆解全解析】 爱普生R270是一款经典的多功能喷墨打印机,集打印、扫描、复印和传真功能于一身,深受用户喜爱。拆解打印机是进行维护、清洁或更换零件的重要步骤,对于熟悉其内部结构、排查故障和...

    diffs-to-string:将差异流或差异数组转换为字符串

    差异到字符串 将一组差异转换为字符串。 您可以使用生成更改。 基本例子 var diffs2string = require ( 'diffs-to-string' ) var changes = [ [ { country : 'germany' , capital : null } , { country : '...

    ipad2的拆解过程全记录

    ### iPad2拆解过程全记录 #### 一、iPad2外观与设计 iPad2在设计上进行了显著的改进,特别是其边缘变得更加薄且具有锥形,这一设计灵感来源于第四代iPod Touch。这种设计不仅提高了手持舒适度,还使得iPad2整体看...

    iphone5s完全拆解全过程

    【iPhone 5S 完全拆解全过程】 2013年9月20日,苹果发布了全新的iPhone 5S,这款设备不仅在性能上有所提升,还引入了许多创新技术,如Touch ID指纹识别系统。在对这款设备进行了性能评测、行货体验以及发售现场的...

    计算机硬盘完全拆解全过程(全程详细图解)

    本文将通过全程详细图解,解析硬盘完全拆解的过程,特别是关键的磁头更换环节,这对于理解硬盘工作原理以及数据恢复至关重要。 一、硬盘的内部结构与工作原理 硬盘主要由底座(Base)、马达(Motor)、磁盘(Disc...

    hibernate将本地SQL查询结果封装成对象

    在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...

    ThinkpadE40拆解全过程.doc

    Thinkpad E40作为一款经典的商务笔记本,其拆解过程需要细心与耐心。下面,我们将详细介绍Thinkpad E40的拆解步骤,让你更好地了解你的设备。 **拆解前的准备** 在开始拆解前,确保你的手部干燥,以避免静电对内部...

    柴油发动机拆解、组装工艺设计.doc

    这些技术参数和操作步骤是确保柴油发动机拆解与组装过程中的安全和效率的关键,严格执行可以保证发动机的正常运行和长期可靠性。在整个过程中,每个环节都需谨慎对待,遵循规程,确保每一个细节都符合标准,这样才能...

Global site tag (gtag.js) - Google Analytics