当使用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;
示例结果: