先看下面这段代码, 它将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编写的代码, 搜索拆分字符串
### SQL Server 实现字符拆解成表格的形式 在SQL Server中,经常需要处理字符串操作,例如将一个包含多个值的字符串拆分成多个行。这种需求常见于数据导入、数据清洗等场景。本篇文章将详细介绍如何利用SQL Server...
四则运算解析器是一种计算机程序,它能够接收包含加、减、乘、除等四则运算符的字符串表达式,并将其转化为可执行的计算过程。这个解析器通常用于解决基础的数学问题,对于编程初学者来说,理解并实现这样一个解析器...
Hive SQL 拆解字段详解 Hive SQL 中的拆解字段是指将一个字段拆分成多个子字段,以便更好地分析和处理数据。在 Hive 中,可以使用多种函数来拆解字段,本文将详细介绍四种常用的函数:SPLIT、SUBSTRING_INDEX、...
蓝桥杯培训教程 一、 逻辑推理 二、排序 三、 图形(矩阵) 四、 数字变幻 五、 数字组合与拆解 六、 字符串 七、 数制转换 八、 排列组合 九、 其它 十、 数据结构
《3D零件拆解组装平台:教育科研与学习的新维度》 在当今的教育科研领域,创新的教学工具正逐渐成为提升学习效率和实践能力的关键。本文将深入探讨一种名为“3D零件拆解组装平台”的学习工具,它以其独特的优势为...
3. **组装模拟**:用户可以模拟不同零件的组装过程,检查配合是否紧密,运动是否顺畅,以及是否存在干涉等问题。 4. **动画演示**:平台可能还支持生成装配和拆卸的动态演示,方便向其他团队成员或客户展示设计概念...
任务是在这个环形字符串中找到一个子字符串,要求该子字符串中字符`o`出现的次数为偶数,并且该子字符串尽可能长。最终输出这个最长子字符串的长度。 **输入描述**: - 输入是一个小写字母组成的字符串`s`。 - 字符...
标题:“js处理json以及字符串的比较等常用操作” 知识点: 1. JSON的处理:在JavaScript中,JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。其易于人阅读和编写,同时也易于机器解析和生成。在...
总的来说,`split()`函数是Python中处理字符串的基石之一,通过理解和熟练运用它,开发者可以轻松地对字符串进行拆解,从而更好地进行数据处理和分析。无论是简单的文本分割还是复杂的字符串操作,`split()`都能提供...
在VB(Visual Basic)编程语言中,逆序输出是一个常见的编程练习,旨在帮助学习者理解字符串操作、变量处理以及流程控制的基本概念。本篇将深入探讨如何在VB中实现逆序输出,包括代码分析、原理讲解及实际应用,旨在...
【爱普生R270打印机拆解全解析】 爱普生R270是一款经典的多功能喷墨打印机,集打印、扫描、复印和传真功能于一身,深受用户喜爱。拆解打印机是进行维护、清洁或更换零件的重要步骤,对于熟悉其内部结构、排查故障和...
差异到字符串 将一组差异转换为字符串。 您可以使用生成更改。 基本例子 var diffs2string = require ( 'diffs-to-string' ) var changes = [ [ { country : 'germany' , capital : null } , { country : '...
### iPad2拆解过程全记录 #### 一、iPad2外观与设计 iPad2在设计上进行了显著的改进,特别是其边缘变得更加薄且具有锥形,这一设计灵感来源于第四代iPod Touch。这种设计不仅提高了手持舒适度,还使得iPad2整体看...
【iPhone 5S 完全拆解全过程】 2013年9月20日,苹果发布了全新的iPhone 5S,这款设备不仅在性能上有所提升,还引入了许多创新技术,如Touch ID指纹识别系统。在对这款设备进行了性能评测、行货体验以及发售现场的...
本文将通过全程详细图解,解析硬盘完全拆解的过程,特别是关键的磁头更换环节,这对于理解硬盘工作原理以及数据恢复至关重要。 一、硬盘的内部结构与工作原理 硬盘主要由底座(Base)、马达(Motor)、磁盘(Disc...
在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...
Thinkpad E40作为一款经典的商务笔记本,其拆解过程需要细心与耐心。下面,我们将详细介绍Thinkpad E40的拆解步骤,让你更好地了解你的设备。 **拆解前的准备** 在开始拆解前,确保你的手部干燥,以避免静电对内部...
这些技术参数和操作步骤是确保柴油发动机拆解与组装过程中的安全和效率的关键,严格执行可以保证发动机的正常运行和长期可靠性。在整个过程中,每个环节都需谨慎对待,遵循规程,确保每一个细节都符合标准,这样才能...