发布于 2016-05-03 04:13:48 | 285 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的SQL Server教程,程序狗速度看过来!

SQL Server 数据库

SQL Server 即 Microsoft SQL Server 。 SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。


今天为了实现一个很原始的问题上网查资料,见到一个很有意思的SQL语句,和大家分享一下

要实现的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中的一些特性,和大家分享一下



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务