很有意思的SQL多行数据拼接
2012-03-31 14:16
351 查看
为了实现一个很原始的问题上网查资料,见到一个很有意思的SQL语句,和大家分享一下
要实现的SQL查询很原始:
View Code
现将SQL进行一下分析:
总共使用到的点有:OUTER APPLY,FOR XML AUTO。由于对SQL Server没有很深的研究,所以记录一下
OUTER APPLY 是SQL2005开始支持的一种查询方法,类似于连接查询,是将两个查询结果进行拼接,但是奇特的是,使用OUTER APPLY竟然能够在Apply后面的查询中使用前面已经得到的查询结果。
如:
第一段SQL显然是错的,有两个原因:1.Cross Join本来就是无条件的,2. SQl Server会爆出如下错误:
The multi-part identifier “A.username” could not be bound.
大家可能会说有条件的Join查询本来就不是这样写的,应该写为第二条SQL这样的样子,其实这样写和第三条SQL中使用Outer apply 实现的效果是一样的
可是 Outer Apply还能实现如下的效果
这个恐怕直接使用join就有点麻烦了,上面的例子也许没什么意义,其实SQL2005提出Apply连接方法主要是为了在连接查询中使用已经执行的查询语句的结果
除了“OUTER APPLY”,SQL Server还有CROSS APPLY,之间的区别主要是在Null值的处理上
FOR XML AUTO 主要用于将SQL的查询结果直接返回成XML语句,For Xml 除了auto外 还有RAW和EXPLICIT,详见《超级简单:使用FOR XML AUTO控制XML输出》
在文章刚开始提出的SQL文,就是使用了上面的两个特性,首先使用Outer Apply来实现类似于使用userpart进行分组的效果,来分别筛选出各个userpart中的user,然后由于筛选出的结果是多行,所以使用 for xml 来把多行数据拼接成xml,最后很二的对xml进行拆分….
综上,感觉这种实现方式比较独特,又学习了SQL Server中的一些特性,和大家分享一下
要实现的SQL查询很原始:
View Code
SELECT * FROM( SELECT DISTINCT userpart FROM userino )A OUTER APPLY( SELECT [usernames]= replace(replace(replace((SELECT username as value FROM userino N WHERE userpart = A.userpart order by n.username asc FOR XML AUTO),’“/><N value=”‘,’/'),’<N value=“‘,”),’”/>’,”) )N OUTER APPLY( SELECT [username_cns]= replace(replace(replace((SELECT username_cn as value FROM userino M WHERE userpart = A.userpart order by m.username asc FOR XML AUTO),’“/><M value=”‘,’/'),’<M value=“‘,”),’”/>’,”) )M
现将SQL进行一下分析:
总共使用到的点有:OUTER APPLY,FOR XML AUTO。由于对SQL Server没有很深的研究,所以记录一下
OUTER APPLY 是SQL2005开始支持的一种查询方法,类似于连接查询,是将两个查询结果进行拼接,但是奇特的是,使用OUTER APPLY竟然能够在Apply后面的查询中使用前面已经得到的查询结果。
如:
select * from (select * from userino) Ajoin (select username from userino ) B on a.username = b.usernameselect * from (select * from userino) AOUTER APPLY (select username from userino where username = A.username ) B
第一段SQL显然是错的,有两个原因:1.Cross Join本来就是无条件的,2. SQl Server会爆出如下错误:
The multi-part identifier “A.username” could not be bound.
大家可能会说有条件的Join查询本来就不是这样写的,应该写为第二条SQL这样的样子,其实这样写和第三条SQL中使用Outer apply 实现的效果是一样的
可是 Outer Apply还能实现如下的效果
select * from (select * from userino) AOUTER APPLY (select [value] = a.username+’test’ ) B
这个恐怕直接使用join就有点麻烦了,上面的例子也许没什么意义,其实SQL2005提出Apply连接方法主要是为了在连接查询中使用已经执行的查询语句的结果
除了“OUTER APPLY”,SQL Server还有CROSS APPLY,之间的区别主要是在Null值的处理上
FOR XML AUTO 主要用于将SQL的查询结果直接返回成XML语句,For Xml 除了auto外 还有RAW和EXPLICIT,详见《超级简单:使用FOR XML AUTO控制XML输出》
在文章刚开始提出的SQL文,就是使用了上面的两个特性,首先使用Outer Apply来实现类似于使用userpart进行分组的效果,来分别筛选出各个userpart中的user,然后由于筛选出的结果是多行,所以使用 for xml 来把多行数据拼接成xml,最后很二的对xml进行拆分….
综上,感觉这种实现方式比较独特,又学习了SQL Server中的一些特性,和大家分享一下
相关文章推荐
- 很有意思的SQL多行数据拼接
- 很有意思的SQL多行数据拼接
- 很有意思的SQL多行数据拼接
- 很有意思的SQL多行数据拼接
- 很有意思的SQL多行数据拼接 转
- 很有意思的SQL多行数据拼接
- 很有意思的SQL多行数据拼接
- sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果
- sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
- SQL多行数据拼接OUTER APPLY,CROSS APPLY,FOR XML AUTO
- sql语句 一个表 用户产生两条不同类型的数据 拼接成一条数据
- SQL SERVER 用sql语句将一列数据拼接成一个字符串
- SQL 向表中插入数据(单行/多行)
- SQLSqlserver中如何将一列数据拼接成一个字符串
- 【SQL】ORACLE更新多行数据,利用decode函数,对应关系,改数据
- Oracle 把某一列的多行数据拼接为一个字符串
- Excel数据拼接sql
- 将sql表中的数据多行动态的转为多列
- mybatis sql拼接中文数据乱码