sqlserver xml转表 及(cross apply与outer apply)
一. 需求是需要把','分割的字符串转为表,便于做关联查询,于是发现可以通过xml转为表,如下:
declare @XXX xml
set @XXX = '
<v>
<aa>12345</aa>
<bb>23456</bb>
</v>
<v>
<aa>54321</aa>
<bb>65432</bb>
</v>' SELECT F.p.value('.', 'varchar(100)') as ccc,F.p.value('.[1]', 'varchar(5)') as a_a,F.p.value('bb[1]', 'varchar(5)') as b_b,
F.p.query('aa').value('.[1]', 'varchar(5)') as aa,F.p.query('bb').value('.[1]', 'varchar(5)') AS bb
FROM @XXX .nodes('/v') AS F(p)
下面是字符串转表:
declare @str varchar(200),@split varchar(10)
set @str='1,2,3,4,5,6'
set @split=','
declare @xml xml
set @xml=convert(xml,'<v>'+replace(@str,',','</v>,<v>')+'</v>')
select val=f.p.value('.',varchar(100)) from @xml.nodes('/v') f(p)--这里不能直接使用convert(xml,'<v>'+replace(@str,',','</v>,<v>')+'</v>'),语法错误,原因不知
字符串转表还可以通过分割拼接的方式,如下:
create Function StrToTable(@str varchar(1000))
Returns @tableName Table
(
str2table varchar(50)
)
As
--该函数用于把一个用逗号分隔的多个数据字符串变成一个表的一列,例如字符串'1,2,3,4,5' 将编程一个表,这个表
Begin
set @str = @str+','
Declare @insertStr varchar(50) --截取后的第一个字符串
Declare @newstr varchar(1000) --截取第一个字符串后剩余的字符串
set @insertStr = left(@str,charindex(',',@str)-1)
set @newstr = stuff(@str,1,charindex(',',@str),'')
Insert @tableName Values(@insertStr)
while(len(@newstr)>0)
begin
set @insertStr = left(@newstr,charindex(',',@newstr)-1)
Insert @tableName Values(@insertStr)
set @newstr = stuff(@newstr,1,charindex(',',@newstr),'')
end
Return
End
引用如下:
declare str vchar(100) set str='1,2,3' select * from tablename where id in (select str2table from StrToTable(@str) )
二. outer apply和cross apply 交叉查询
outer apply:结果集中将包含使右表表达式为空的左表表达式中的行。
cross apply:结果集中不包含使右表表达式为空的左表表达式中的行。
测试如下:
IF OBJECT_ID('Employees') IS NOT NULL
DROP TABLE Employees
CREATE TABLE Employees
(
empid INT NOT NULL,
deptid INT NULL,
empname VARCHAR(25) NOT NULL
)
GO
IF OBJECT_ID('Departments') IS NOT NULL
DROP TABLE Departments
CREATE TABLE Departments
(
deptid INT NOT NULL PRIMARY KEY,
deptname VARCHAR(25) NOT NULL
)
GO
INSERT INTO employees VALUES (1,NULL,'Nancy')
INSERT INTO employees VALUES (2,1,'Andrew')
INSERT INTO employees VALUES (3,2,'Steven')
INSERT INTO employees VALUES (4,3,'Robert')
INSERT INTO employees VALUES (5,3,'Ann')
INSERT INTO employees VALUES (6,4,'Ina')
INSERT INTO employees VALUES (7,4,'David')
INSERT INTO employees VALUES (8,5,'James')
INSERT INTO departments VALUES (1,'HR')
INSERT INTO departments VALUES (2,'Marketing')
INSERT INTO departments VALUES (3,'Finance')
INSERT INTO departments VALUES (4,'R&D')
INSERT INTO departments VALUES (5,'Training')
INSERT INTO departments VALUES (6,'Gardening')
GO
-- cross apply query
SELECT *
FROM departments AS D
cross apply (select * from employees where deptid=D.deptid) E

-- outer apply query 把左侧表departments 有的deptid为6的,emloyees中没有关联的查询出来了。
SELECT *
FROM departments AS D
outer apply (select * from employees where deptid=D.deptid) E

sqlserver xml转表 及(cross apply与outer apply)的更多相关文章
- SQLServer count函数、cross apply和outer apply、
1.COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)2.COUNT(*) 函数返回表中的记录数 select * from TABLE_1 T1 outer ap ...
- SQLSERVER CROSS APPLY 与 OUTER APPLY 的应用
日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或多条记 ...
- SQLServer连接查询之Cross Apply和Outer Apply的区别及用法
https://blog.csdn.net/wikey_zhang/article/details/77480118 先简单了解下cross apply的语法以及会产生什么样的结果集吧! 示例表: S ...
- SQL Server连接查询之Cross Apply和Outer Apply的区别及用法(转载)
先简单了解下cross apply的语法以及会产生什么样的结果集吧!示例表: SELECT * FROM tableA CROSS APPLY tableB 两张表直接连接,不需要任何的关联条件,产生 ...
- SQL 关于apply的两种形式cross apply 和 outer apply(转)
转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...
- SQL 关于apply的两种形式cross apply 和 outer apply
SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...
- SQL关于apply的两种形式cross apply和outer apply(转载)
SQL 关于apply的两种形式cross apply 和 outer apply apply有两种形式: cross apply 和 outer apply 先看看语法: <lef ...
- SqlSever 使用 CROSS APPLY 与 OUTER APPLY 连接查询
前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某一条或 ...
- 使用 CROSS APPLY 与 OUTER APPLY 连接查询
Ø 前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某 ...
随机推荐
- iconFont 阿里巴巴矢量图标使用方法
挑选图标的过程(共6步) 进入网站:Iconfont网址:http://www.iconfont.cn 点击网站上方的“官方图标库”,选择自己喜欢的图标.在这里我选择天猫的图标库. 选择好自己喜欢的图 ...
- wf效能分析
听从了老师的建议我请教了其他的同学,修改了代码实现了功能四,以下是我的效能测试: 1.采用ptime.exe测试的3次截图 可以看到的是三次执行时间分别为:1.449秒:0.915秒:0.871秒,取 ...
- iOS- 网络请求的两种常用方式【GET & POST】的区别
GET和POST 网络请求的两种常用方式的实现[GET & POST] –GET的语义是获取指定URL上的资源 –将数据按照variable=value的形式,添加到action所指向的URL ...
- iOS中UIButton控件的用法及部分参数解释
在UI控件中UIButton是极其常用的一类控件,它的类对象创建与大多数UI控件使用实例方法init创建不同,通常使用类方法创建: + (id)buttonWithType:(UIButtonType ...
- 3ds Max学习日记(七)
第7章讲的是多边形建模,实例略多,有十六个,再加上周日的怠惰感,只做了几个实例. 附上今日的劳动成果: 布料(创建一个平面,转换为可编辑多边形,然后调整顶点,连接一些边,添加网格平滑,转换为可 ...
- java 基础--继承--007
1,子类只能继承父类所有非私有成员 2,子类不能继承父类的构造方法,但可以通过super去访问父类构造方法 3,子类成员变量和父类成员变量名称不一样,如果一样类似于重写,按子类处理,如果一样,就近原则 ...
- Android------BottonTabBar
前言:一款简单好用封装好的AndroidUI控件,底部导航栏. 1.使用 1.1添加 compile 'com.hjm:BottomTabBar:1.1.1' 1.2 activity_main. ...
- 不能将多个项传入“Microsoft.Build.Framework.ITaskItem”类型的参数
项目编译报错: ”对于“GenerateApplicationManifest”任务的“InputManifest”参数是无效值.不能将多个项传入“Microsoft.Build.Framework. ...
- 当重写了 httpservlet重写了GenericServlet的init方法时候 必须显示调用GenericServlet的init方法时候 才能在别的方法(父类创建config实例) 例如 doget里面使用servletContext对象 不重写init 则可以直接使用
- BZOJ 1202 狡猾的商人(带权并查集)
给出了l,r,w.我们就得知了s[r]-s[l-1]=w.也就是说,点l-1和点r的距离为w. 于是可以使用带权并查集,定义dis[i]表示点i到根节点的距离.查询和合并的时候维护一下就OK了. 如果 ...