【译】高级T-SQL进阶系列 (二)【下篇】:使用 APPLY操作符
【译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正】
原文链接:传送门。
使用OUTER APPLY 操作符
OUTER APPLY操作符工作起来和CROSS APPLY比较类似。唯一的不同在于OUTER APPLY操作符对于那些从表值函数不返回任何数据行的列仍旧会返回结果集。为了看其是如何工作的我们可以查看列表3的代码。
USE tempdb;
GO
SELECT *
FROM dbo.SearchString AS S
OUTER APPLY dbo.FindProductLike(S.String);
列表3:OUTER APPLY示例
当我运行列表3的代码,将得到报告2的输出结果。
ID String ProductName Price
----- ---------------- -------------------------- ---------
1 Red Red Santa Suit 199.99
1 Red Red Bells 49.99
2 Lights LED Lights 6.99
3 Star NULL NULL
报告2:通过运行列表3的代码产生的输出
通过使用OUTER APPLY操作符,你可以看到对于字符串值“Star”,存在一个数据行,其ProductName列和Price列均为Null值。这是因为SearchString表的字符串值“Star”并没有发现是Product表的任何ProductName列的一部分。当表值函数dbo.FindProductLike使用了列值而返回了一个空的数据行集时,SQL SERVER便会对表值函数产生的数据列赋以null值。OUTER APPLY操作符的这个功能类似与当在两个表之间使用OUTER JOIN而并没有匹配行的情形。当一个字符串传递给表值函数dbo.FindProductLike并确实返回数据行时,那么SearchString表的数据行便会与表值函数的结果进行关联,如果一个CROSS APPLY操作符被使用的时候发生的一样。
使用一个表值表达式
到此为止,我仅仅向你展示了APPLY操作符应用在一个数据集和一个表值函数之间的情形。除此之外,APPLY操作符同样可以与表值表达式一起工作。为了看这是如何进行的,我们可以查看列表4的代码:
,
列表4:CROSS APPLY与表值表达式一起使用
当我运行列表4的代码将得到报告3的输出。
ID String ProductName Price
----- ---------------- -------------------------- ---------
1 Red Red Santa Suit 199.99
1 Red Red Bells 49.99
2 Lights LED Lights 6.99
报告3:通过运行列表4的代码产生的输出
列表4的代码与列表2的代码是等效的,并且报告3的输出是与报告1的输出完全一致。在列表4中,我将CROSS APPLY右边的表达式字符串更改为相关的子查询,这个子查询使用了从SearchString表来的String列的值来找到其ProductName列包含此字符串值的所有Product数据。
同样我也可以拿到列表4的代码并通过将CROSS APPLY更改为OUTER APPLY从而使其与列表3的代码相等。我将让你来做这个更改并运行新的代码来验证它确实产生了和报告2一样的输出。
总结
APPLY操作符允许你将一个数据集中的列与一个表值函数或者一个表值表达式进行关联,通过使用APPLY操作符你可以写基于集合的查询,并且其中的一个集合是表值函数或者表值表达式。下次你需要将一个数据集的行与一个表值函数或者表值表达式进行关联,你可以使用APPLY操作符。
Q&A
您可以通过回答以下问题,来检验对APPLY 操作符的了解使用情况。
Q1:
APPLY 操作符允许您将记录集合与标量函数关联(TRUE 或 FALSE)?
- TRUE
- FALSE
Q2:
APPLY操作符支持哪两种格式?
- CROSS APPLY
- FULL APPLY
- INNER APPLY
- OUTER APPLY
Q3:
如果您想通过使用APPLY操作符从记录集合结合表值函数返回所有记录,APPLY操作符支持哪种格式?
- CROSS APPLY
- OUTER APPLY
A:
Q1:
正确答案是b或者False。APPLY操作符不允许您将记录集合与标量函数关联。但它允许您将记录集合与表值函数或标志表达式关联。
Q2:
正确答案是a和b。APPLY操作符支持CROSS APPLY和FULL APPLY。
Q3:
正确答案是b。a不正确的原因是如果您使用CROSS APPLY操作符您将不会返回所有行通过记录集合结合表值函数。OUTER APPLY操作是唯一格式,确保所有与表值函数关联的记录返回在最终的结果集合中。
【译】高级T-SQL进阶系列 (二)【下篇】:使用 APPLY操作符的更多相关文章
- Wireshark入门与进阶系列(二)
摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...
- Bing Maps进阶系列二:使用GeocodeService进行地理位置检索
Bing Maps进阶系列二:使用GeocodeService进行地理位置检索 在<Bing Maps进阶系列一:初识Bing Maps地图服务>里已经对GeocodeService的功能 ...
- Spring Boot进阶系列二
上一篇文章,主要分析了怎么建立一个Restful web service,系列二主要创建一个H5静态页面使用ajax请求数据,功能主要有添加一本书,请求所有书并且按照Id降序排列,以及查看,删除一本书 ...
- SQL 工具系列二
1.RedGate 工具 SQL Prompt 脚步智能提示工具 脚步提示工具,轻松写入,编辑和探索SQL: SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为 ...
- 高级java必会系列二:多线程经常使用的3个关键字:synchronized、ReentrantLock、volatile
系列一讲解了多线程,本章讲解多线程开发中经常使用到的3个关键字synchronized.ReentrantLock.volatile. 一.synchronized 互斥锁,即操作互斥,并发线程过来, ...
- Linq To Sql进阶系列(六)用object的动态查询与保存log篇
动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动 ...
- SQL进阶系列之11让SQL飞起来
写在前面 SQL的性能优化是数据库使用者必须面对的重要问题,本节侧重SQL写法上的优化,SQL的性能同时还受到具体数据库的功能特点影响,这些不在本节讨论范围之内 使用高效的查询 参数是子查询时,使用E ...
- SQL进阶系列之7用SQL进行集合运算
写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...
- SQL进阶系列之5外连接的用法
写在前面 SQL本身是作为一种数据提取工具而出现,使用SQL生成各种定制化报表和非定制化报表并非SQL原本用途的功能,但这并不意味着SQL无法实现这些功能. 用外连接进行行列转换(1)(行 → 列): ...
- 进阶系列二【绝对干货】---Quartz.Net的入门
一.Quartz.Net是什么? Quartz.Net是一个开源的作业调度框架,OpenSymphony的开源项目,是Quartz的C#移植项目.非常适合在平时的工作中,定时轮询数据库同步,定时邮件通 ...
随机推荐
- html滑动
$('html, body').animate({scrollTop: 1500}, 'fast');
- html中的路径详解
路径指文件存放的位置,在网页中利用路径可以引用文件,插入图像.视频等.表示路径的方法有两种:相对路径,绝对路径.以下讨论均是在HTML环境下进行. 相对路径 相对路径是指目标相对于当前文件的路径,网页 ...
- rabbitmq 命令行与控制台
命令行和管控台 rabbitmqctl stop_app 关闭应用 rabbitmqctl start_app 打开应用 rabbitmqctl status 节点状态 rabbitmqctl add ...
- bugku 细心
打开链接会看到提醒404 显示不能访问 然后用御剑 扫描一下 然后会发现另一个 网址 然后打开 发现 有一个/result.php然后改一下 网址会发现 另一个网页 然后利用提示 将链接的后缀名改成? ...
- Caffe 笔记 (一)caffe的层与数据结构
Caffe是纯粹的C++/CUDA架构,支持命令行.Python和MATLAB接口:可以在CPU和GPU直接无缝切换: Caffe::set_mode(Caffe::GPU); Caffe的优势 1. ...
- org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接. at org ...
- Dart语言学习(三)Dart数值型
一.类型 数值型有 num,int, double num a = ; a = 12.5; print(a); print(a.runtimeType); ; // b = 20.5; print( ...
- Nginx做缓存
查看服务 netstat -lntp|grep 80 Nginx作为缓存WEB服务 通常情况下缓存是用来减少后端压力, 将压力尽可能的往前推, 减少后端压力,提高网站并发延时 Nginx代理缓存原理 ...
- 数据库持久化框架——MyBatis(1)
叨叨时刻:内容根据阿里云大学的MyBatis视频教程整理而成,有需要最好跟着视频教程走一遍 MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 ...
- Spring Boot 开发环境IDEA下的热部署
这个知识点忘记写了,我不是很热衷于IDEA的热部署,觉得太消耗机器性能. 1 引入 Pom <!--热部署--> <dependency> <groupId>org ...