【译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正】

原文链接:传送门

使用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操作符的更多相关文章

  1. Wireshark入门与进阶系列(二)

    摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...

  2. Bing Maps进阶系列二:使用GeocodeService进行地理位置检索

    Bing Maps进阶系列二:使用GeocodeService进行地理位置检索 在<Bing Maps进阶系列一:初识Bing Maps地图服务>里已经对GeocodeService的功能 ...

  3. Spring Boot进阶系列二

    上一篇文章,主要分析了怎么建立一个Restful web service,系列二主要创建一个H5静态页面使用ajax请求数据,功能主要有添加一本书,请求所有书并且按照Id降序排列,以及查看,删除一本书 ...

  4. SQL 工具系列二

    1.RedGate 工具 SQL Prompt 脚步智能提示工具 脚步提示工具,轻松写入,编辑和探索SQL: SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为 ...

  5. 高级java必会系列二:多线程经常使用的3个关键字:synchronized、ReentrantLock、volatile

    系列一讲解了多线程,本章讲解多线程开发中经常使用到的3个关键字synchronized.ReentrantLock.volatile. 一.synchronized 互斥锁,即操作互斥,并发线程过来, ...

  6. Linq To Sql进阶系列(六)用object的动态查询与保存log篇

    动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动 ...

  7. SQL进阶系列之11让SQL飞起来

    写在前面 SQL的性能优化是数据库使用者必须面对的重要问题,本节侧重SQL写法上的优化,SQL的性能同时还受到具体数据库的功能特点影响,这些不在本节讨论范围之内 使用高效的查询 参数是子查询时,使用E ...

  8. SQL进阶系列之7用SQL进行集合运算

    写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...

  9. SQL进阶系列之5外连接的用法

    写在前面 SQL本身是作为一种数据提取工具而出现,使用SQL生成各种定制化报表和非定制化报表并非SQL原本用途的功能,但这并不意味着SQL无法实现这些功能. 用外连接进行行列转换(1)(行 → 列): ...

  10. 进阶系列二【绝对干货】---Quartz.Net的入门

    一.Quartz.Net是什么? Quartz.Net是一个开源的作业调度框架,OpenSymphony的开源项目,是Quartz的C#移植项目.非常适合在平时的工作中,定时轮询数据库同步,定时邮件通 ...

随机推荐

  1. Js将字符串转换成对象或数组en

    举个例子 var test='{ colkey: "col", colsinfo: "NameList" }' a.将文本转换成对象 var test='{ c ...

  2. js加密(四)landChina

    1. url:https://www.landchina.com/default.aspx?tabid=226 2. target: 3. 简单分析 3.1 打开fiddler和chorme无痕浏览器 ...

  3. MNIST 数据集

    mnist 数据集:包含 7 万张黑底白字手写数字图片,其中 55000 张为训练集,5000 张为验证集,10000 张为测试集.每张图片大小为 28*28 像素,图片中纯黑色像素值为 0,纯白色像 ...

  4. Bugku-CTF分析篇-抓到一只苍蝇(在哪?here!卧槽?!好大一坨苍蝇。)

    抓到一只苍蝇 抓到一只苍蝇         本题要点:pcapng包导出文件.合并连续的pcapng包.rar文件头.binwalk基本使用.foremost安装及使用     下载完成后,发现有这样 ...

  5. Euler Sums系列(六)

    \[\Large\displaystyle \sum_{n=1}^{\infty}\frac{H_{2n}}{n(6n+1)}\] \(\Large\mathbf{Solution:}\) Let \ ...

  6. URLEncode和URLDecode

    URLEncode.encode(String s,String utf-8) 编码 URLDEcode.decode(String %2b%,String utf-8) 解码 用法: String ...

  7. 定义列属性:null,default,PK,auto_increment

    *定义列属性* 1.列属性NULL: 是否为空,规定一个字段的值是否可以是null: null|not null 2.默认值属性:default value  默认值,在没有为该字段设置值时启用:而且 ...

  8. GO学习之 安装Go语言及搭建Go语言开发环境

    一.下载 1.下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 2.版本的选择 Windows ...

  9. Cosmetic Airless Bottles To Meet Practical Requirements

    Today, people use cosmetic bottles, many of which are in cosmetic airless bottles. We can use them, ...

  10. mysql测试点

    前言 性能测试过程中,数据库相关指标的监控是不可忽视的,在这里我们就MySQL的监控配置及重点涉及性能的一些参数进行说明. 在笔者的日常性能测试过程中,重点关注了这些参数,但不代表仅仅只有这些参数对性 ...