APPLY操作符-它如何决定哪些行是两个集合之间的匹配?



当使用JOIN时,很清楚是什么决定了行是否匹配,例如ON a. someid1 =b.SomeID1。因此,返回的唯一行将是由别名a和b引用的表中存在匹配的'SomeID1'的行。

我最初的想法是,当使用APPLY时,WHERE子句通常放在右侧查询中,以提供类似于JOIN的ON子句的功能。

但是,在使用APPLY时,我看到许多SQL查询在右侧查询中不包括WHERE。那么,这是否意味着结果行将是两个表中行数的乘积?

当使用APPLY时,什么逻辑决定哪些行将在左右查询之间匹配?

我试了很多博客文章,这里的答案,甚至YouTube视频,但没有一个解释让我"点击"。

apply运算符(在支持它的数据库中)实现了一种称为横向连接的join类型

对我来说,理解它的最好方法是从相关子查询开始。例如:

select a.*,
(select count(*) 
from b
where b.a_id = a.a_id
--------------^
) as b_count
from a;

子查询正在计算a中的每一行在b中的匹配行数。它是如何做到的呢?关联子句是将子查询映射到外部查询的条件。

Apply的工作方式相同:

select a.*, b.b_count
from a outer apply
(select count(*) as b_count
from b
where b.a_id = a.a_id
------------^
) b;

换句话说,关联子句就是你问题的答案。

横向连接相关子查询有什么区别?有三个不同之处:
  • 横向连接可以返回多个行。
  • 横向连接可以返回多个列。
  • 横向连接在FROM子句中,因此返回的列可以在查询中多次引用。

关于Gordon的精彩回答:

APPLY不需要相关(即它使用外部查询的列),关键是它是横向(它为每个行返回一个新的结果集)。

从基本查询开始:

select c.*
from customer c;

示例结果:

<表类>Id名称tbody><<tr>1约翰2杰克

相关内容

  • 没有找到相关文章

最新更新