第一部分:APPLY 与 JOIN

你可能知道,SQL Server 中的 JOIN 操作用于联接两个或多个表。但是,在 SQL Server 中,JOIN 操作不能用于将表与表值函数的输出联接起来。如果你没有听说过表值函数,这些函数是以表的形式返回数据。为了连接两个表表达式,SQL Server 2005 引入了 APPLY 运算符。在本篇文章中,我们将了解 APPLY 运算符与常规 JOIN 的不同之处。

关于 CROSS APPLY 和 OUTER APPLY

SQL Server 的 APPLY 运算符有两种变体:CROSS APPLY 和 OUTER APPLY:

  • CROSS APPLY 运算符仅返回左表表达式(在其最终输出中)中与右表表达式匹配的那些行。 因此,CROSS APPLY 类似于 INNER JOIN,或者更准确地说,类似于具有相关子查询的 CROSS JOIN,其隐式联接条件为 1=1。
  • OUTER APPLY 运算符返回左表表达式中的所有行,而不管其与右表表达式的匹配情况。对于右表表达式中没有相应匹配项的那些行,它在右表表达式的列中返回 NULL 值。 因此,OUTER APPLY 等效于 LEFT OUTER JOIN。

尽管可以使用普通的 JOIN 编写相同的查询,但当右侧有一个表值表达式并且你希望为左侧表表达式中的每一行计算此表值表达式时,就需要使用 APPLY。此外,在某些情况下,使用 APPLY 运算符可以提高查询性能。

让我们通过一些示例进一步探索 APPLY 运算符。

样本数据

我们将在Navicat for SQL Server中执行查询以创建的两个新表。这是 Department 表的设计:

这是 Employee 表的设计:

在 Navicat 查询编辑器中执行以下 SQL 以填充表:

INSERT [Department] ([DepartmentID], [Name])
VALUES (1, N'Engineering')
INSERT [Department] ([DepartmentID], [Name])
VALUES (2, N'Administration')
INSERT [Department] ([DepartmentID], [Name])
VALUES (3, N'Sales')
INSERT [Department] ([DepartmentID], [Name])
VALUES (4, N'Marketing')
INSERT [Department] ([DepartmentID], [Name])
VALUES (5, N'Finance')
GO INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (1, N'Orlando', N'Gee', 1 )
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (2, N'Keith', N'Harris', 2 )
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (3, N'Donna', N'Carreras', 3 )
INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
VALUES (4, N'Janet', N'Gates', 3 )

CROSS APPLY vs INNER JOIN

这是一个由两部分组成的查询:第一个查询从 Department 表中选择数据,并使用 CROSS APPLY 为 Department 表的每条记录对 Employee 表求值;第二个查询只是将 Department 表与 Employee 表联接起来以产生相同的结果:

第 二部分预告

在本文介绍了 APPLY 运算符之后,第二部分将概述使用 APPLY 和 JOIN 之间的区别,并会讲述 APPLY 的其他用途。如果你想试用 Navicat 16,可以在这里下载 Navicat 的 14 天全功能免费试用版。

往期回顾

Navicat 被投毒了 | 真相来了!

Navicat 成为信通院数据库创新实验室成员

Navicat 学术伙伴计划 - 免费教育版申请

Navicat 技术智库 - 实战演练与各类热门问题解答

免费试用攻略 | Navciat 16 数据库管理工具

浅析 SQL Server 的 CROSS APPLY 和 OUTER APPLY 查询 - 第一部分相关推荐

  1. SQL Server中CROSS APPLY和OUTER APPLY的应用详解

    SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表达式都可以, ...

  2. SQL Server 2008的cross apply 和 outer apply

    我们知道有个 SQL Server 2000 中有个 cross join 是用于交叉联接的.实际上增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数 ...

  3. sql out apply_在SQL Server中CROSS APPLY和OUTER APPLY之间的区别

    sql out apply SQL Server supports table valued functions, what are functions that return data in the ...

  4. mysql cross apply_SQL Server CROSS APPLY和OUTER APPLY的应用详解

    SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能 SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY ...

  5. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 阅读目录 SQL 关于apply的两种形式cross apply 和 outer apply Sql学习第四天--S ...

  6. SQL 关于apply的两种形式cross apply 和 outer apply(转)

    转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...

  7. 【转载】SQL 关于apply的两种形式cross apply 和 outer apply

    apply有两种形式: cross apply 和 outer apply 先看看语法: <left_table_expression>  {cross|outer} apply < ...

  8. Sql Server的Cross Apply用法

    apply有两种形式: cross apply 和 outer apply 区别在于指定OUTER,意味着结果集中将包含使右表表达式为空的左表表达式中的行, 而指定CROSS,则相反,结果集中不包含使 ...

  9. sqlserver中cross apply与outer apply用法

    apply有两种形式: cross apply 和 outer apply 先看看语法: <left_table_expression>  {cross|outer} apply < ...

最新文章

  1. 机器人x展架制作_易拉宝展架设计制作常规尺寸材质有哪些?
  2. matlab矩阵连接图解
  3. 互联网1分钟 |1217
  4. mongo执行逻辑表达式_MongoDB 高级查询
  5. iOS 修改项目名称
  6. 小程序在wxml页面中取整
  7. 2008安装完了找不到_7206BEP.进口轴承_玉溪SKF轴承安装指南
  8. 【软件测试】你的简历出现这些问题?没人要也是有原因的
  9. 卸载列表信息——Uninstall注册表
  10. day17-25序列化、python操作CSV/EXCEL/PDF/WORD/PPT文件、爬虫、正则表达式
  11. mysql rrd_时间序列数据库rrd启动
  12. 参考《机器学习实战》高清中文PDF+高清英文PDF+源代码
  13. python绘制人物关系图_文本分析之制作网络关系图——Python
  14. [微软拼音小技巧] 如何用Unicode输入生僻字
  15. 【web常见的攻击方式有哪些?如何防御?】
  16. 关于Winxp U盘无法复制磁盘写保护解决办法
  17. UML ~ Unified Modeling Language ~ 统一建模语言。+ 软件设计原则。
  18. 常用DEBUG命令及使用详解
  19. HP M132snw 打印机如何在换路由器的时候更换整个局域网配置?
  20. Latex 论文插入copyright

热门文章

  1. Java数组初始化动态初始化
  2. 对于软件价值管理的思考--《PMO论文集2019》(电子版)
  3. 刘晗:用“大数据”给电影“算命” 年进账百万
  4. wps兑换优惠券在哪里_年底了,攒了几万的「支付宝积分」兑换了吗?
  5. 女友逢车必晕,轻则身心难受,重则翻江倒海 吾看此情况甚为心疼!故找此一篇希望有帮助《防治晕车七法》
  6. Evil.js(罪恶的) —— 代码
  7. MLA Review之一: KNN算法
  8. 三级计算机网络技术综合题知识点,三级计算机网络技术填空题练习
  9. 跟着数百万人编程导师学C语言!
  10. 飞兔论Scrum:工作本是一首诗