MSSQL·APPLY关键字的学习理解

阅文时长 | 1.26分钟 字数统计 | 2027.2字符
主要内容 | 1、引言&背景 2、官方定义&示例 3、CROSS APPLY和CROSS JOIN是等价的吗?如果不等价的话,区别在哪里? 4、声明与参考资料
『MSSQL·APPLY关键字的学习理解』
编写人 | SCscHero 编写时间 | 2021/8/19 PM9:9
文章类型 | 系列 完成度 | 已完成
座右铭 每一个伟大的事业,都有一个微不足道的开始。

一、引言&背景   完成度:100%

a) 应对问题

  1. APPLY关键字的基本用法、作用、官方定义、使用场景是怎样的?
  2. CROSS APPLY和CROSS JOIN是等价的吗?如果不等价的话,区别在哪里?
  3. OUTER APPLY和CROSS APPLY区别是什么?

b) 应对场景

  1. 涉及APPLY关键字的场景、或涉及CROSS APPLY的场景。
  2. 涉及到表值函数相关的场景。

c) 术语概念

笛卡尔积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。通俗理解的话博主可以举个例子,例如有两个集合,一个有Y个元素,一个有X个元素,那么他们的笛卡尔积就是X × Y个元素。

二、官方定义&示例   完成度:100%

a) CROSS JOIN的官方定义

The Crossjoin function returns the cross product of two or more specified sets. The order of tuples in the resulting set depends on the order of the sets to be joined and the order of their members. For example, when the first set consists of {x1, x2,...,xn}, and the second set consists of {y1, y2, ..., yn}, the cross product of these sets is:
{(x1, y1), (x1, y2),...,(x1, yn), (x2, y1), (x2, y2),...,
(x2, yn),..., (xn, y1), (xn, y2),..., (xn, yn)}

----来自《微软英文文档·Crossjoin (MDX)》[1]

b) APPLY的官方定义

APPLY运算符的左操作数和右操作数都是表表达式。这些操作数之间的主要区别是,right_table_source可以使用表值函数,该函数可从left_table_source获取一个列作为函数的参数之一。left_table_source可以包括表值函数,但不能以来自 right_table_source的列作为参数。
APPLY运算符通过以下方式工作,以便为FROM子句生成表源:
针对left_table_source的每一行计算right_table_source以生成行集。
right_table_source中的值取决于left_table_source。right_table_source可以按以下方式近似表示:TVF(left_table_source.row),其中,TVF是表值函数。
通过执行UNION ALL操作,将计算right_table_source的值时为每行生成的结果集与left_table_source组合起来。
APPLY运算符的结果生成的列的列表是来自left_table_source(与来自right_table_source的列的列表相组合)的一组列。

----来自《微软中文文档·使用Apply》[2]

c) Apply官方示例

  • 将左结果集作为参数传入表值函数。
  • 这里还介绍了下OUTER APPLY和CORSS APPLY的区别:即,左结果集没有匹配到右边结果集(表值函数中的数据)的情况:
    CROSS APPLY:不显示左结果集中未匹配到的记录。类似于INNER JOIN。
    OUTER APPLY:显示左结果集中匹配到的记录。类似于LEFT JOIN。

三、CROSS APPLY和CROSS JOIN是等价的吗?如果不等价的话,区别在哪里?   完成度:100%

a) 等价的情况

  1. 如果使用无条件连接的话。如下图,两种写法是等价的。都是显示笛卡尔积

b) 不等价的情况

不等价情况:CROSS JOIN和CROSS APPLY语法结构上的不同。例如CROSS JOIN带上条件会报错。

四、声明与参考资料   完成度:100%

微软中文文档·FROM 子句以及 JOIN、APPLY、PIVOT (Transact-SQL)

原创博文,未经许可请勿转载。

如有帮助,欢迎点赞、收藏、关注。如有问题,请评论留言!如需与博主联系的,直接博客私信SCscHero即可。


  1. 微软英文文档·Crossjoin (MDX) ↩︎

  2. 微软中文文档·使用Apply ↩︎

posted on 2021-08-22 01:09  SCscHero  阅读(876)  评论(0编辑  收藏  举报

导航