要实现的SQL查询很原始

日期:2020-01-12编辑作者:北京pk10官网-数据库

要实现的SQL查询很原始:

要求从第一个表进行查询得到第二个表格式的数据,上网查询之后竟然能写出下面的SQL:复制代码 代码如下: select * from userino 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) A cross join (select username from userino where username = A.username )B select * from (select * from userino) A join (select username from userino ) B on a.username = b.username select * from (select * from userino) A OUTER 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) A OUTER 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中的一些特性,和大家分享一下

本文由北京pk赛车官网下载发布于北京pk10官网-数据库,转载请注明出处:要实现的SQL查询很原始

关键词:

设置密码保护的SqlServer数据库备份文件与恢复文

设置密码保护SqlServer数据库备份文件! 备份SqlServer数据库 BackupDatabase [数据库] To disk='c:mysql'+replace(replace(replace(repla...

详细>>

向日期加上2天 select dateadd(day

一、Sql Server中的日期与时间函数 1. 当前系统日期、时间 selectgetdate() 2. dateadd 在向指定日期加上一段时间的基础上,...

详细>>

区段编码

编号 标准宗地编码(landCode) 所在区段编码(sectCode) 1 131001BG001 G001 2 131001BG002 G001 3 131001BG003 G001 4 131001BG004 G002 5 131001BG...

详细>>

索引是在特定表或视图框架内存在的对象

学习SQL Server 2012编程入门经典(第4版)的笔记 1.事务日志 任意数据库的更改起初不进入数据库本身,而是不断地被写...

详细>>