有趣的SQL多行数据拼接
来源:爱站网时间:2020-12-14编辑:网友分享
在学习之前小编一直都是很讨厌SQL多行数据拼接的,但是今天的这个方法让小编不由自主的爱上了,那么接下来小编就不多说了,下面我们就一起去了解有趣的SQL多行数据拼接内容吧。
在学习之前小编一直都是很讨厌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
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
现将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还能实现如下的效果
上文就是小编介绍有趣的SQL多行数据拼接的内容,看完后是不是觉得这个方法很特别呢?今天我们又学习了SQL Server中的一些特性。
下一篇:实现数据库中自动生成编号的方法