很有意思的SQL多行数据拼接

时间:2024-01-28 02:08:56 

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

标签:SQL,数据拼接
0
投稿

猜你喜欢

  • 基于mysql事务、视图、存储过程、触发器的应用分析

    2024-01-28 18:27:51
  • python二叉树类以及其4种遍历方法实例

    2023-07-25 02:22:48
  • Django基础CBV装饰器和中间件的应用示例

    2023-09-30 06:17:07
  • Python单元测试_使用装饰器实现测试跳过和预期故障的方法

    2022-07-27 17:53:44
  • 查询SQLServer启动时间的三种方法

    2024-01-15 18:15:42
  • 关于pyqt5控件自适应窗口超详细知识点汇总

    2021-03-26 14:37:57
  • python输出决策树图形的例子

    2022-02-07 09:14:54
  • Python中的异常类型及处理方式示例详解

    2022-10-27 14:55:58
  • js拖拽效果的原理及实现

    2024-04-10 10:43:29
  • 将MSSQL Server 导入/导出到远程服务器教程的图文方法分享

    2024-01-13 21:55:42
  • 妙用dw图层与表格进行网页布局

    2009-07-14 21:57:00
  • js 原型对象和原型链理解

    2024-04-23 09:20:23
  • 彻底理解Python list切片原理

    2023-10-19 03:34:43
  • Python转换字典成为对象,可以用"."方式访问对象属性实例

    2021-06-01 09:01:50
  • 带你彻底搞懂python操作mysql数据库(cursor游标讲解)

    2024-01-25 21:53:58
  • Python Pillow Image.save 保存为jpg图片压缩问题

    2023-07-05 11:13:49
  • SQL Server 安装出错:以前的某个程序安装已在安装计算机上创建挂起的文件操作

    2010-02-23 14:48:00
  • 全面分析Python的优点和缺点

    2023-11-09 11:00:07
  • Python迷宫生成和迷宫破解算法实例

    2023-12-11 11:46:43
  • Python Selenium操作Cookie的实例方法

    2022-10-22 10:21:34
  • asp之家 网络编程 m.aspxhome.com