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 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某 ...
随机推荐
- 单源最短路——dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...
- Token安全
token相对安全加密算法 http://blog.csdn.net/q8649912/article/details/52370565 关于文章的理解 1 sessionid 这个名词应该理解为:一 ...
- DEDE去掉会员登录及注册验证码的方法
1.登录打开member/index_do.php 删除245-250行,即: if(strtolower($vdcode)!=$svali || $svali=='') { ResetVdValue ...
- Pandas速查手册中文版(转)
关键缩写和包导入 在这个速查手册中,我们使用如下缩写: df:任意的Pandas DataFrame对象 同时我们需要做如下的引入: import pandas as pd 导入数据 pd.read_ ...
- 累积下学习 C#时和 Java时的不同点
==和equals()方法的区别: 首先有一个观点: 这两个都是用来比较值是否相等的 ( 这里的值有时候指的是地址值, 有时候是存储的值; 下面将地址值称为地址, 存储的值称为值 ) 在Java中: ...
- Mybatis笔记二
一对一查询 案例:查询所有订单信息,订单信息中显示下单人信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...
- hadoop MapReduce辅助排序解析
1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...
- CF#508 1038E Maximum Matching
---题面--- 题解: 感觉还是比较妙的,复杂度看上去很高(其实也很高),但是因为n只有100,所以还是可以过的. 考虑一个很暴力的状态f[i][j][x][y]表示考虑取区间i ~ j的方格,左右 ...
- BZOJ3456:城市规划——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3456 求出n个点的简单(无重边无自环)无向连通图数目 模数很熟悉,先敲一个NTT. 然后通过推导式 ...
- BZOJ1503:[NOI2004]郁闷的出纳员——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...